一、分析程序的一些保护措施(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()
七、运行结果