-
-
[原创]2018科来杯PWN复现
-
发表于: 2020-11-1 10:08 7168
-
32 位的程序,存在很明显的格式化字符串漏洞
数一下偏移,第四个
有个 cat flag 的后门 0x8048616,但是有一个 number 限制,nubmer 要等于 8216 才行,可以直接让他执行 0x8048638 那一块,那就覆写 puts 函数的 got 表把
程序的逻辑挺简单的,free 之后没有置为 NULL
另外还提供了 system 的地址,可以直接拿来算 libc 的基址了
首先 malloc 一个,free 之后再去编辑,编辑成 malloc_hook(tcache 不会对 size 进行检查,所以可以直接申请到 malloc_hook 这里)
然后 malloc 两次就申请到了 malloc_hook 那里了,再去编辑就可以把 malloc_hook 改为 one_gadget 的地址,这样去 malloc 的时候就可以拿到 shell
啊啊啊,好简单的说
官方 writeup 说是:cve-2018-6789
要先了解一下 base64 编码的 C 语言实现,可以参考:https://bbs.pediy.com/thread-253433.htm
程序自己会申请 0x30 大小的 chunk(malloc(0x28) 但是要对齐所以 0x30)用来直接存放 name、base64 解码后的 password 的指针以及 content 的指针,同时申请的这个会被放到 bss 段的 ptr 数组上面,后面就把这个用户申请的 chunk 成为 note_header
说一下漏洞点:
在涉及 password 的时候会 malloc 相应的 size,通过对 base64 编码的了解,我们已经知道了 base64 编码后应该都是 4 的倍数,它将会被解码为 3 的倍数的长度,然后下面的代码中给了 3n + 1 的空间,是没有问题的
但是如果构造一个 4n+3 的 base64 编码去让他解码用到的就是 3n+2 就 off by one 了
例如:123 经过 base64 编码之后是:MTIz,在末尾加上两个字符:'MTI',去解码的时候会解码为 12312
本来是 4*1,加上两个之后就是 4*1+3 然后解码出来是 3*1+2
同时会在 *(_DWORD *)(note_header + 36) = 1
标注是否设置了 password
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
- 对某款智能手表的分析与攻击 6438
- [原创][车联网安全]使用STM32开发板实战汽车UDS诊断 15013
- [分享]binwalk路径穿越导致RCE(CVE-2022-4510) 9980
- [原创]Hack-A-Sat 2020预选赛 beckley 13583
- [原创]一个BLE智能手环的分析 31543