Chr*_*ris 12 linux buffer gdb overflow
我在软件安全类中,我们目前正在学习缓冲区溢出以及它们如何被利用.我有一个程序,我知道如何利用,但我似乎无法这样做,因为我必须写十六进制,它不允许我写.
我需要编写从以下位置生成的数据:
perl -e 'print "A"x48; print "\x1b\x88\x04\x08";'
Run Code Online (Sandbox Code Playgroud)
但是,我无法将该输出重定向到命令行参数,因为该程序以交互方式运行.从历史上看,我已经使用xclip将其复制到剪贴板,然后将其粘贴到正在运行的应用程序中,但由于某种原因,这个十六进制序列不允许我使用xclip来复制它(它显示没有被复制).
例如:
perl -e 'print "A"x48; print "\x1b\x88\x04\x08";' | xclip -sel clip
Run Code Online (Sandbox Code Playgroud)
如果我之后按ctrl + V,则不会粘贴任何内容.如果我只是复制并粘贴终端窗口的输出,则会粘贴错误的十六进制(我假设这是因为十六进制不是可见的ASCII).
我的问题是:GDB是否有办法将生成的文本插入到交互式的运行程序中?
我知道如果可利用程序采用命令行参数,我可以这样做:
run $(perl -e 'print "A"x48; print "\x1b\x88\x04\x08";')
Run Code Online (Sandbox Code Playgroud)
但由于它不通过cli参数运行,因此无法使用.
任何帮助都是极好的!
Emp*_*ian 25
我的问题是:GDB是否有办法将生成的文本插入到交互式的运行程序中?
您的问题基于误解:您似乎认为GDB以某种方式拦截您正在执行的"粘贴",而不是让目标程序读取字符.
但是,除非您在断点处(或由于信号)停止,否则GDB 不会拦截任何输入.因此,当您的程序正在运行(并读取输入)时,GDB本身会被阻止(在系统调用中)等待某些事情发生.waitpid
那么是什么阻止你的程序接收控制字符?你的终端模拟器呢.
好的,你怎么安排非ASCII输入?3种方式中的一种(两种非常相似):
对于方法#1:
perl -e 'print "A"x48; print "\x1b\x88\x04\x08";' > /tmp/input
gdb ./a.out
(gdb) run < /tmp/input # voila: GDB reads terminal,
# your program reads /tmp/input
Run Code Online (Sandbox Code Playgroud)
方法2:
mkfifo /tmp/pipe
perl -e 'print "A"x48; print "\x1b\x88\x04\x08";' > /tmp/pipe &
# perl will block, waiting for someone to read the pipe
gdb ./a.out
(gdb) run < /tmp/pipe
Run Code Online (Sandbox Code Playgroud)
上述两种方法都为"正常"的程序(那些读工作STDIN),但将失败对于直接读取终端程序(如sudo,passwd,gpg).
方法3:
perl -e 'print "A"x48; print "\x1b\x88\x04\x08";' |
gdbserver :0 ./a.out # gdbserver will print a TCP port, e.g. 4321
# and stop the program at start
# in another window,
gdb ./a.out
(gdb) target remote :4321
# gdb will now attach to gdbserver, you can set breakpoints and continue.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10387 次 |
| 最近记录: |