ret2text
机器环境
1 | gcc version 11.3.0 (Debian 11.3.0-5) |
test.c源码
- test.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void shell(){
system("/bin/bash");
}
void print_name(char *input){
char buf[15];
memcpy(buf,input,0x100);
printf("Hello %s\n",buf);
}
int main(int argc,char **argv){
char buf[0x100];
puts("ck");
read(0,buf,0x100);
print_name(buf);
return 0;
} - 编译时注意关闭pie
1
gcc -no-pie test.c
- 目录树
1
2
3.
├── a.out
└── test.c步骤
- 利用pwntools查看文件保护信息
1
2
3
4
5
6
7
8
9from pwn import *
elf=ELF('./a.out')
#result
[*] '/home/xxx/test/a.out'
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x400000) - 使用ida打开a.out
- 进入print_name函数中,查看buf分配大小,dest的rbp大小为0x0f。
- 查看shell函数的地址,shell函数的入口地址为0x040116。
- Ubuntu18.04 64位 和 部分Ubuntu16.04 64位 调用system的时候,rsp的最低字节必须为0x00(栈以16字节对齐),否则无法运行system指令。要解决这个问题,只要将返回地址设置为跳过函数开头的push rbp就可以了。
根据以上信息就可以写exp了。
exp
1 | #python3 |
结果
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 0xchang's Blog!