这一题发现两个答案,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标记断点。