[长城杯 2024] anote


main
1 | int __cdecl main(int a1) |
- add >> 每次 add 都会申请一个大小为 0x20 的堆

我们发现在 User_data 区一直存放着一个固定的指针指向 0x8048f48

跟进 __ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc_w

1 | int std::operator<<<std::char_traits<char>>() |
提出思考:如果我们可以想办法篡改该指针,我们就可以劫持该指针指向 backdoor 获取 shell。
edit 要求我们修改的长度不超过 0x40,这个长度已经足够我们进行堆溢出了
gift 可以帮我们泄露堆地址。
backdoor
1 | int sub_80489CE() |

EXP 思路:
我们前面思考利用 user_data 的存放的指针去篡改 user_data 去指向 system(‘/bin/sh’); ,但是需要考虑到一个问题,即 0x8048f48 是一个二级指针,直接存放 backdoor 地址经过二次解析之后为 NULL,因此我们需要先把 backdoor 填入我们堆上的某地址,再篡改二级指针为刚才存入后门函数的地址,就可以进行二次解析获取 shell

1 | from pwn import * |
更新: 2026-05-06 22:01:08
原文: https://www.yuque.com/idcm/wnemg9/gh10oh8f8w93mcko