Debugging EDB-如何调试以I/o重定向为参数的程序?

Debugging EDB-如何调试以I/o重定向为参数的程序?,debugging,assembly,x86,Debugging,Assembly,X86,我有一个x86 asm程序,可以将小写字母转换为大写字母。我在一个汇编pdf中找到了它,我正在玩它来学习。程序可以这样调用 ./uppercaser > in.txt < out.txt /uppercaser>in.txtin.txt附加 选择过程“nc” 现在转到IO部分,运行“nc 127.0.0.1 90” 现在您的终端已打开 您可以用系统上的任何其他可用端口替换90 这两种方法对我都很有效。如果你正在做任何形式的pentesting,我建议你使用第二种方法检查它在哪里停止

我有一个x86 asm程序,可以将小写字母转换为大写字母。我在一个汇编pdf中找到了它,我正在玩它来学习。程序可以这样调用

./uppercaser > in.txt < out.txt
/uppercaser>in.txt
我试图添加某种形式的错误检查作为练习,正如你可以想象的那样,对于像我这样的新手来说,这并不顺利。我想在调试器中运行该程序以查看发生了什么,但在EDB中按原样运行它是不起作用的,因为该程序需要输入。我在谷歌上搜索过如何做到这一点,显然

edb --run ./uppercaser > in.txt < out.txt
edb--run./uppercaser>in.txt
是应该这样做的,但是当我像那样运行它时,程序在几条指令之后无法继续在调试器中执行,就像我在没有输入的情况下运行它一样。那么我该如何实现这一点呢

我意识到,由于对汇编和调试非常陌生,我可能对事情的工作原理有一个根本性的误解,但我假设程序在几条指令后停止进入调试器,因为它正在等待输入,而没有得到任何指令。

edb并不能让这变得容易。不幸的是,这甚至是不可能的(除了修改edb,它是开源的)

如果可以在程序执行任何操作之前暂停程序,则可以附加到任何终端中已经运行的进程,而不是启动新的xterm

如果要将数据导入流程,可以使用命名管道。e、 g

   mkfifo   mypipe
   ./testprog < mypipe &           # or not in the background
     # tab over to EDB and attach to testprog
   (echo ...; cat - ) > mypipe     # in a different terminal if you want

它只运行带有
的命令,我还没有使用输入+输出进行测试,但是如果需要使用输入文件,可以构建某种python“包装器”作为一个单行程序。对我来说很有用,也许不漂亮,但对我的意图来说没问题:

python -c 'from time import sleep;sleep(20);a=open("input","r";content=a.read();print(content);a.close;'|./myapp
您现在有20秒的时间运行并连接edb。您可以根据需要更改睡眠计时器。 在另一个终端中,您可能希望运行类似

edb --attach $(pidof myapp)

方法1

EDB中有一个运行按钮,您必须单击该按钮两次,I/O终端将打开。此外,运行edb的窗口将显示TTY流的位置。]

方法2

如果要将二进制“大写字母”的I/O重定向到网络端口,可以使用netcat工具(nc)执行以下操作

edb --attach $(pidof myapp)
  • 运行“nc-nlvp 90-e上壳器”
  • 通过运行“edb”打开edb调试器
  • 在GUI中,选择文件-->附加
  • 选择过程“nc”
  • 现在转到IO部分,运行“nc 127.0.0.1 90”
  • 现在您的终端已打开 您可以用系统上的任何其他可用端口替换90


    这两种方法对我都很有效。如果你正在做任何形式的pentesting,我建议你使用第二种方法

    检查它在哪里停止以及为什么停止。可能它已经在.txt中使用了您的
    ,或者缺少行尾标记或类似标记。还要检查它是否不是
    edb
    本身执行.txt中的
    。您也可以尝试在没有程序的情况下启动
    edb
    ,然后在
    edb
    中使用
    run
    命令。我不知道edb,但是当您使用gdb(gnu调试器)时,您需要在代码中设置一些断点,以便能够一步一步地完成它并查看寄存器内容。当您从一开始就使用run with gdb时,它将不停地运行您的程序,这不是很有用(但我对这一点也不熟悉。)我最终选择了gdb路线,从gdb内部运行“set args>out.txtnc
    进程吗?或者,当侦听netcat forks+execs
    uppercaser
    时,EDB是否跟踪到子进程?@PeterCordes EDB在侦听netcat forks+execs时跟踪到子进程!事实上,在过去的12个小时里,我一直在尝试各种各样的选择。我的问题是我无法将所有可能的十六进制值粘贴到终端中,以找出缓冲区溢出漏洞的坏字符。上面提到的方法2最终对我有效。我成功地生成并分析了子进程的分段错误!漂亮。如果您只想将数据粘贴到其中,
    mkfifomypipe
    可能就是您想要的。然后
    testprog
    ,连接到它,然后
    (echo…;cat)>mypipe
    edb --attach $(pidof myapp)