嗨我想写一个溢出漏洞利用我已经建立的一个简单的程序。贝娄是我写的C程序。重写EBP栈返回值
#include <unistd.h>
#include <string.h>
#include <stdio.h>
char *string_in = "Did not work";
int test(char *this){
char sum_buf[6];
strncpy(sum_buf,this,24);
return 0;
}
void hello(){
printf("hello man");
string_in = "If this triggered, it means our shell code is working\n";
return;
}
int main(int argc, void **argv){
test("\x00\x40\x06\x02");
printf("My string is %s",string_in);
return 0;
}
基本上发生的事情是该字符串是假设在一个覆盖EBP具有0x00400602的价值,这是我的hello()函数的返回地址进行读取。我知道这是自函数hello以来objdump -d test_stack.o的地址值。从对象转储,我可以告诉大家,RSP已提前20个字节,如图波纹管
00000000004005b4 <test>:
4005b4: 55 push %rbp
4005b5: 48 89 e5 mov %rsp,%rbp
4005b8: 48 83 ec 20 sub $0x20,%rsp
4005bc: 48 89 7d e8 mov %rdi,-0x18(%rbp)
4005c0: 64 48 8b 04 25 28 00 mov %fs:0x28,%rax
4005c7: 00 00
4005c9: 48 89 45 f8 mov %rax,-0x8(%rbp)
4005cd: 31 c0 xor %eax,%eax
4005cf: 48 8b 4d e8 mov -0x18(%rbp),%rcx
4005d3: 48 8d 45 f0 lea -0x10(%rbp),%rax
4005d7: ba 18 00 00 00 mov $0x18,%edx
4005dc: 48 89 ce mov %rcx,%rsi
4005df: 48 89 c7 mov %rax,%rdi
4005e2: e8 a9 fe ff ff callq 400490 <[email protected]>
4005e7: b8 00 00 00 00 mov $0x0,%eax
4005ec: 48 8b 55 f8 mov -0x8(%rbp),%rdx
4005f0: 64 48 33 14 25 28 00 xor %fs:0x28,%rdx
4005f7: 00 00
4005f9: 74 05 je 400600 <test+0x4c>
4005fb: e8 a0 fe ff ff callq 4004a0 <[email protected]>
400600: c9 leaveq
400601: c3 retq
0000000000400602 <hello>:
400602: 55 push %rbp
400603: 48 89 e5 mov %rsp,%rbp
400606: b8 6d 07 40 00 mov $0x40076d,%eax
40060b: 48 89 c7 mov %rax,%rdi
40060e: b8 00 00 00 00 mov $0x0,%eax
400613: e8 98 fe ff ff callq 4004b0 <[email protected]>
400618: 48 c7 05 0d 0a 20 00 movq $0x400778,0x200a0d(%rip) #
由于子$ 20,%RSP我知道我需要写ATLEAST 20个字节......但我不知道我还需要写多少才能到达我的rbp。它可能来自我的calq's,我需要写8或我的字节,因为有2个电话。虽然我真的不知道我需要写多少。
我编译我的程序是这样的...
gcc -g stack.c -o test_stack.o
execstack -s test_stack.o
由于我使用Ubuntu 11,我的内核版本为3.0.17一样,所以我知道我的ASLR默认是开启的。我可能需要关闭它,但我不知道该怎么做。另外我正在运行一个i386:x86_64。我可以告诉我的堆栈在运行过程中的样子吗?我怎样才能使这个工作,我怎么找到我需要写多少?
感谢您的帮助
我看到的一个问题是,您没有使用足够的字节作为函数的地址。你需要32位:'\ x00 \ x40 \ x06 \ x01'。另外,我认为你可能需要颠倒这些字节的顺序,因为x86在内存中将0x00400601存储为0x01,0x06,0x40,0x00。最后,我不知道我的建议是否会有所帮助。它的类型取决于gcc创建栈帧的方式。您最好在调试器中单步执行,以便您可以看到发生了什么。 – 2012-04-19 22:16:33
你的权利,我忘了输入最后一个字节。谢谢,我会看看这是否有效。 – 2012-04-19 22:42:48
大声笑,现在我没有得到一个stackoverflow错误。棒极了!但不管出于什么原因它不是printf()。 – 2012-04-19 22:53:28