我必须为一个类做一些二进制分析,而且我被困在其中一个程序上。当我设置一些断点和disas时,我看到它看起来像这样:
Dump of assembler code for function main:
0x080484e2 <+0>: push %ebp
0x080484e3 <+1>: mov %esp,%ebp
0x080484e5 <+3>: sub $0x48,%esp
0x080484e8 <+6>: and $0xfffffff0,%esp
0x080484eb <+9>: mov $0x0,%eax
0x080484f0 <+14>: sub %eax,%esp
0x080484f2 <+16>: cmpl $0x1,0x8(%ebp)
0x080484f6 <+20>: jg 0x8048504 <main+34>
0x080484f8 <+22>: movl $0x7,(%esp)
=> 0x080484ff <+29>: call 0x804833c <exit@plt>
0x08048504 <+34>: mov 0xc(%ebp),%eax
0x08048507 <+37>: add $0x4,%eax
0x0804850a <+40>: mov (%eax),%eax
0x0804850c <+42>: mov %eax,(%esp)
0x0804850f <+45>: call 0x804832c <atoi@plt>
0x08048514 <+50>: mov %eax,-0x10(%ebp)
0x08048517 <+53>: cmpl $0xd,-0x10(%ebp)
0x0804851b <+57>: jne 0x804853b <main+89>
0x0804851d <+59>: lea -0x38(%ebp),%eax
0x08048520 <+62>: mov %eax,(%esp)
0x08048523 <+65>: call 0x8048414 <makebuf>
0x08048528 <+70>: lea -0x38(%ebp),%eax
0x0804852b <+73>: mov %eax,0x4(%esp)
0x0804852f <+77>: movl $0x804863b,(%esp)
** 0x08048536 <+84>: call 0x804831c <printf@plt>
0x0804853b <+89>: movl $0x1,(%esp)
0x08048542 <+96>: call 0x804833c <exit@plt>
End of assembler dump.
(我已在编辑printf @ plt的位置旁边的星星中编辑过)。 它对我来说是一个程序,它调用exit(),然后构建一个字符串,然后打印出该字符串,然后再执行另一个exit()。我想如果我可以绕过第一次调用exit(),它会打印出挑战的答案。是否正确的方法来设置执行NOP的调用位置?如果是这样,NOP的操作码是什么?我已经尝试设置为0x0和0x00000000。任何帮助将不胜感激!谢谢。
答案 0 :(得分:3)
看一下
行0x080484f2 <+16>: cmpl $0x1,0x8(%ebp)
0x080484f6 <+20>: jg 0x8048504 <main+34>
并确定如何让程序跳过第一个出口 - 无需注射
答案 1 :(得分:1)
由于这一行,它不一定会退出:
cmpl $0x1,0x8(%ebp)
在这一行中,程序用一个检查该函数的第一个参数的值,如果它更大,则跳转。
另外,如果您想在此处查看printf的格式,可以在gdb中输入printf "%s", 0x804863b
更新:
如果此过程是主要的,则0x8($ebp)
包含所谓的argc,它是程序的输入数。所以你需要做的是当你运行程序时给它输入。比如./a.out blah
您也可以在gdb中输入x/2wx $esp
来检查此值。
答案 2 :(得分:1)
您可能不希望只是NOP退出调用退出。这次你可能能够逃脱它,但是在两次退出调用中,他们都会在调用之前将退出代码放到堆栈上。根据程序的其余部分,可能会也可能不会使用这些堆栈值。
所以你可以选择NOP淘汰MOV和CALL,或者强迫跳跃总是按你想要的方式进行。
或者最好的方法是弄清楚究竟是什么参数让它做你想做的事。
x86的标准NOP操作码也是0x90。
答案 3 :(得分:1)
如果这是关于家庭作业,那么你应该知道允许做什么。
如果允许修补,那么最好的方法是将操作码从jg更改为jng,你必须查看intel手册以查看必须更改的内容,但通常是一个字节。 / p>
如果不允许修补,那么你必须找到将设置正在比较的变量的函数,并弄清楚如何使该函数将其设置为其他东西。
答案 4 :(得分:0)
0x90是x86的NOP指令。因此0x90是一条NOP指令,0x9090是两条NOP指令,0x90909090是4条NOP指令。
仔细检查call 0x804833c
指令的长度。我不相信它长4个字节。