
程序分析:
main
函数比较多,直接搜索 main 函数:目前看起来是比较正常的菜单题
1 | int __fastcall main(int argc, const char **argv, const char **envp) |

menu:
1 | __int64 __fastcall menu(__int64 a1, __int64 a2, int a3, int a4, int a5, int a6) |
运行一下程序,寻找对应参数表示的字符串:

pijiu
1 | __int64 pijiu() |
这里 v9 猜测是 count 数量,每种啤酒都是十元,下面的串也是,一串五元
chuan:
1 | __int64 chuan() |
yue:
1 | __int64 __fastcall yue(__int64 a1, __int64 a2, int a3, int a4, int a5, int a6) |
打印出来剩余的余额,一开始有 233 元

vip:
1 | __int64 vip() |

当你想要承包摊位的时候会发现资金不够
gaming:
1 | /* |
可知除了荧幕上显示的 12340 五个选项外还有一个选项,但前提是能够有钱买下摊位,也就是 own > 1;
EXP 思路:
想了一段时间,但是并没有发现可疑且可疑控制的地方,后来突发奇想,余额是根据总金额- 10*v9来计算的,既然没有对 v9 进行校验,那么我们传入负数是不是就可以增大金额了呢?事实上确实是这样:

那么我们很快就可以创建我们的第一个摊位了:在这之后我们就可以进行选项 5 了

1 | IO_puts((__int64)&unk_4B71C0); // 烧烤摊儿已归你所有,请赐名: |
这样我们就可以利用 j_strcpy 函数了
我们发现 name 的地址是写死的,输入一段过长的数字也会造成栈溢出,不过 canary 并没有下在这里面:

因此执行栈溢出之后打一个 ret2syscall 就可以了,和我们之前文章里用的板子是一样的:
总 EXP:
1 | from pwn import * |

说些什么吧!