炸弹实验室 phase_3,不知道如何找到开关块的起始地址
bomb lab phase_3, don't know how to find the starting address for switch block
我正在学这个软件安全class,但是我以前没学过c,学过一些计算机组织class,但是对汇编一点信心都没有。我对 objdump
生成的文件中的所有行进行了注释以帮助自己理解它,但有几件事对我来说仍然没有意义。
我从gdb得到的在最后,基于此,有人可以向我解释一下吗:
根据我现在的理解,字符串格式应该是%d %d
,sscanf
转换的参数个数应该大于1,第一个参数应该是小于 5,所以我输入了 2 3
,但是 gdb 的 disas
中的箭头显示我仍然卡在代码的第一行,我不知道我错在哪里,我就是不能继续。
哪一行告诉我切换规则?看了别人的汇编代码,pattern是这样的,比如*0x402470(,%rax,8)
,pattern是0x402470 + %rax*8
,然后就可以把对应地址的内容打印出来,不知道去哪里找这种模式。我只能看到 *%rax
,但是当我打印出来时,它只是我输入的字符串。
<+28>
行中的 # 0x555555556cf5
和 <+58>
行中的 # 0x555555556a80
是什么?我发现它们总是非常有用,因为我读了别人的post,我知道我在找什么,但我不知道它们是什么..
我学会了%rax
和(%rax)
,但是*%rax
是什么?我无法想象除了直接使用值或将值用作地址之外还有其他情况。
根据我看的gdb教程,x
是显示内存内容,p
是打印一个值,但是value总是存放在某处内存,所以如果我使用地址,它们两个是否相同?我应该什么时候使用哪一个?
任何建议或指导将不胜感激!!!我也在参加关于 ARM 汇编的在线 class,关于我应该研究的更具体 material 的建议也将不胜感激,谢谢!!!!
That's number 2. Keep going!
2 3
Breakpoint 1, 0x00005555555552cd in phase_3 ()
(gdb) disas
Dump of assembler code for function phase_3:
=> 0x00005555555552cd <+0>: sub [=11=]x18,%rsp
0x00005555555552d1 <+4>: mov %fs:0x28,%rax
0x00005555555552da <+13>: mov %rax,0x8(%rsp)
0x00005555555552df <+18>: xor %eax,%eax
0x00005555555552e1 <+20>: lea 0x4(%rsp),%rcx
0x00005555555552e6 <+25>: mov %rsp,%rdx
0x00005555555552e9 <+28>: lea 0x1a05(%rip),%rsi # 0x555555556cf5
0x00005555555552f0 <+35>: callq 0x555555554f20 <__isoc99_sscanf@plt>
0x00005555555552f5 <+40>: cmp [=11=]x1,%eax
0x00005555555552f8 <+43>: jle 0x555555555317 <phase_3+74>
0x00005555555552fa <+45>: cmpl [=11=]x7,(%rsp)
0x00005555555552fe <+49>: ja 0x55555555539d <phase_3+208>
0x0000555555555304 <+55>: mov (%rsp),%eax
0x0000555555555307 <+58>: lea 0x1772(%rip),%rdx # 0x555555556a80
0x000055555555530e <+65>: movslq (%rdx,%rax,4),%rax
0x0000555555555312 <+69>: add %rdx,%rax
0x0000555555555315 <+72>: jmpq *%rax
0x0000555555555317 <+74>: callq 0x5555555559d3 <explode_bomb>
0x000055555555531c <+79>: jmp 0x5555555552fa <phase_3+45>
0x000055555555531e <+81>: mov [=11=]x2ad,%eax
0x0000555555555323 <+86>: jmp 0x55555555532a <phase_3+93>
0x0000555555555325 <+88>: mov [=11=]x0,%eax
0x000055555555532a <+93>: sub [=11=]x228,%eax
0x000055555555532f <+98>: add [=11=]x29e,%eax
0x0000555555555334 <+103>: sub [=11=]xee,%eax
0x0000555555555339 <+108>: add [=11=]xee,%eax
0x000055555555533e <+113>: sub [=11=]xee,%eax
0x0000555555555343 <+118>: add [=11=]xee,%eax
0x0000555555555348 <+123>: sub [=11=]xee,%eax
0x000055555555534d <+128>: cmpl [=11=]x5,(%rsp)
0x0000555555555351 <+132>: jg 0x555555555359 <phase_3+140>
0x0000555555555353 <+134>: cmp %eax,0x4(%rsp)
0x0000555555555357 <+138>: je 0x55555555535e <phase_3+145>
0x0000555555555359 <+140>: callq 0x5555555559d3 <explode_bomb>
0x000055555555535e <+145>: mov 0x8(%rsp),%rax
0x0000555555555363 <+150>: xor %fs:0x28,%rax
0x000055555555536c <+159>: jne 0x5555555553a9 <phase_3+220>
0x000055555555536e <+161>: add [=11=]x18,%rsp
0x0000555555555372 <+165>: retq
0x0000555555555373 <+166>: mov [=11=]x0,%eax
0x0000555555555378 <+171>: jmp 0x55555555532f <phase_3+98>
0x000055555555537a <+173>: mov [=11=]x0,%eax
0x000055555555537f <+178>: jmp 0x555555555334 <phase_3+103>
0x0000555555555381 <+180>: mov [=11=]x0,%eax
0x0000555555555386 <+185>: jmp 0x555555555339 <phase_3+108>
0x0000555555555388 <+187>: mov [=11=]x0,%eax
0x000055555555538d <+192>: jmp 0x55555555533e <phase_3+113>
---Type <return> to continue, or q <return> to quit---q
Quit
(gdb) i r
rax 0x555555758760 93824994346848
rbx 0x0 0
rcx 0x5 5
rdx 0x555555758760 93824994346848
rsi 0x3 3
rdi 0x555555758760 93824994346848
rbp 0x0 0x0
rsp 0x7fffffffdf78 0x7fffffffdf78
r8 0x7ffff7ff7006 140737354100742
r9 0x0 0
r10 0x5 5
r11 0x246 582
r12 0x555555554fe0 93824992235488
r13 0x7fffffffe060 140737488347232
r14 0x0 0
r15 0x0 0
rip 0x5555555552cd 0x5555555552cd <phase_3>
eflags 0x206 [ PF IF ]
cs 0x33 51
ss 0x2b 43
ds 0x0 0
es 0x0 0
fs 0x0 0
gs 0x0 0
(gdb) x/s $rdx
0x555555758760 <input_strings+160>: "2 3"
(gdb) x/s 0x555555556cf5
0x555555556cf5: "%d %d"
(gdb) x/s $rsp
0x7fffffffdf78: "6QUUUU"
(gdb) x 0x555555556a80
0x555555556a80: 0xffffe89e
(gdb) p 0x555555556a80
= 93824992242304
(gdb) x/8a 0x555555556a80
0x555555556a80: 0xffffe8a5ffffe89e 0xffffe8faffffe8f3
0x555555556a90: 0xffffe908ffffe901 0xffffe916ffffe90f
0x555555556aa0 <array.3415>: 0xa00000002 0x100000006
0x555555556ab0 <array.3415+16>: 0x100000000c 0x300000009
(gdb) x/s $r8
0x7ffff7ff7006: "8 16 32\no give Tina Fey more material.\n"
(gdb) x/s $r12
0x555555554fe0 <_start>: "15I11^H12H340PTL5[=11=]520"
(gdb) x/s $r13
0x7fffffffe060: "[=11=]1"
(gdb) x/s $rip
0x5555555552cd <phase_3>: "H340dH3[=11=]4%("
- 您在该位置放置了一个断点。要继续使用
stepi
/nexti
或设置另一个断点。请注意,调用是对 sscanf
的调用,它使用字符串源。到那时你的输入已经从标准输入中读取,它作为参数传递给这个函数。
- +65 到+72 是开关,由于额外添加,它只是分成几个部分。
- 您的反汇编程序的友好服务。它显示了实际计算的地址,因此您不必弄清楚例如什么。
0x1a05(%rip)
会。
*
表示at&t语法中的间接跳转。 jmp *%rax
是 "jump to the address stored in rax"。需要区分 jmp foo
和 jmp *foo
。寄存器操作数是明确的,但仍然使用符号(gas
否则会发出警告)。
- 并非所有值都在内存中。例如,要打印寄存器,您必须使用
p
。您也可以使用 p
通过取消引用来打印内存内容,但 x
更灵活用于此目的。
如果您在 Binary Ninja 或 IDA pro 等反汇编程序中查看二进制文件,它会显示 switch 语句的地址。
我正在学这个软件安全class,但是我以前没学过c,学过一些计算机组织class,但是对汇编一点信心都没有。我对 objdump
生成的文件中的所有行进行了注释以帮助自己理解它,但有几件事对我来说仍然没有意义。
我从gdb得到的在最后,基于此,有人可以向我解释一下吗:
根据我现在的理解,字符串格式应该是
%d %d
,sscanf
转换的参数个数应该大于1,第一个参数应该是小于 5,所以我输入了2 3
,但是 gdb 的disas
中的箭头显示我仍然卡在代码的第一行,我不知道我错在哪里,我就是不能继续。哪一行告诉我切换规则?看了别人的汇编代码,pattern是这样的,比如
*0x402470(,%rax,8)
,pattern是0x402470 + %rax*8
,然后就可以把对应地址的内容打印出来,不知道去哪里找这种模式。我只能看到*%rax
,但是当我打印出来时,它只是我输入的字符串。<+28>
行中的# 0x555555556cf5
和<+58>
行中的# 0x555555556a80
是什么?我发现它们总是非常有用,因为我读了别人的post,我知道我在找什么,但我不知道它们是什么..我学会了
%rax
和(%rax)
,但是*%rax
是什么?我无法想象除了直接使用值或将值用作地址之外还有其他情况。根据我看的gdb教程,
x
是显示内存内容,p
是打印一个值,但是value总是存放在某处内存,所以如果我使用地址,它们两个是否相同?我应该什么时候使用哪一个?
任何建议或指导将不胜感激!!!我也在参加关于 ARM 汇编的在线 class,关于我应该研究的更具体 material 的建议也将不胜感激,谢谢!!!!
That's number 2. Keep going!
2 3
Breakpoint 1, 0x00005555555552cd in phase_3 ()
(gdb) disas
Dump of assembler code for function phase_3:
=> 0x00005555555552cd <+0>: sub [=11=]x18,%rsp
0x00005555555552d1 <+4>: mov %fs:0x28,%rax
0x00005555555552da <+13>: mov %rax,0x8(%rsp)
0x00005555555552df <+18>: xor %eax,%eax
0x00005555555552e1 <+20>: lea 0x4(%rsp),%rcx
0x00005555555552e6 <+25>: mov %rsp,%rdx
0x00005555555552e9 <+28>: lea 0x1a05(%rip),%rsi # 0x555555556cf5
0x00005555555552f0 <+35>: callq 0x555555554f20 <__isoc99_sscanf@plt>
0x00005555555552f5 <+40>: cmp [=11=]x1,%eax
0x00005555555552f8 <+43>: jle 0x555555555317 <phase_3+74>
0x00005555555552fa <+45>: cmpl [=11=]x7,(%rsp)
0x00005555555552fe <+49>: ja 0x55555555539d <phase_3+208>
0x0000555555555304 <+55>: mov (%rsp),%eax
0x0000555555555307 <+58>: lea 0x1772(%rip),%rdx # 0x555555556a80
0x000055555555530e <+65>: movslq (%rdx,%rax,4),%rax
0x0000555555555312 <+69>: add %rdx,%rax
0x0000555555555315 <+72>: jmpq *%rax
0x0000555555555317 <+74>: callq 0x5555555559d3 <explode_bomb>
0x000055555555531c <+79>: jmp 0x5555555552fa <phase_3+45>
0x000055555555531e <+81>: mov [=11=]x2ad,%eax
0x0000555555555323 <+86>: jmp 0x55555555532a <phase_3+93>
0x0000555555555325 <+88>: mov [=11=]x0,%eax
0x000055555555532a <+93>: sub [=11=]x228,%eax
0x000055555555532f <+98>: add [=11=]x29e,%eax
0x0000555555555334 <+103>: sub [=11=]xee,%eax
0x0000555555555339 <+108>: add [=11=]xee,%eax
0x000055555555533e <+113>: sub [=11=]xee,%eax
0x0000555555555343 <+118>: add [=11=]xee,%eax
0x0000555555555348 <+123>: sub [=11=]xee,%eax
0x000055555555534d <+128>: cmpl [=11=]x5,(%rsp)
0x0000555555555351 <+132>: jg 0x555555555359 <phase_3+140>
0x0000555555555353 <+134>: cmp %eax,0x4(%rsp)
0x0000555555555357 <+138>: je 0x55555555535e <phase_3+145>
0x0000555555555359 <+140>: callq 0x5555555559d3 <explode_bomb>
0x000055555555535e <+145>: mov 0x8(%rsp),%rax
0x0000555555555363 <+150>: xor %fs:0x28,%rax
0x000055555555536c <+159>: jne 0x5555555553a9 <phase_3+220>
0x000055555555536e <+161>: add [=11=]x18,%rsp
0x0000555555555372 <+165>: retq
0x0000555555555373 <+166>: mov [=11=]x0,%eax
0x0000555555555378 <+171>: jmp 0x55555555532f <phase_3+98>
0x000055555555537a <+173>: mov [=11=]x0,%eax
0x000055555555537f <+178>: jmp 0x555555555334 <phase_3+103>
0x0000555555555381 <+180>: mov [=11=]x0,%eax
0x0000555555555386 <+185>: jmp 0x555555555339 <phase_3+108>
0x0000555555555388 <+187>: mov [=11=]x0,%eax
0x000055555555538d <+192>: jmp 0x55555555533e <phase_3+113>
---Type <return> to continue, or q <return> to quit---q
Quit
(gdb) i r
rax 0x555555758760 93824994346848
rbx 0x0 0
rcx 0x5 5
rdx 0x555555758760 93824994346848
rsi 0x3 3
rdi 0x555555758760 93824994346848
rbp 0x0 0x0
rsp 0x7fffffffdf78 0x7fffffffdf78
r8 0x7ffff7ff7006 140737354100742
r9 0x0 0
r10 0x5 5
r11 0x246 582
r12 0x555555554fe0 93824992235488
r13 0x7fffffffe060 140737488347232
r14 0x0 0
r15 0x0 0
rip 0x5555555552cd 0x5555555552cd <phase_3>
eflags 0x206 [ PF IF ]
cs 0x33 51
ss 0x2b 43
ds 0x0 0
es 0x0 0
fs 0x0 0
gs 0x0 0
(gdb) x/s $rdx
0x555555758760 <input_strings+160>: "2 3"
(gdb) x/s 0x555555556cf5
0x555555556cf5: "%d %d"
(gdb) x/s $rsp
0x7fffffffdf78: "6QUUUU"
(gdb) x 0x555555556a80
0x555555556a80: 0xffffe89e
(gdb) p 0x555555556a80
= 93824992242304
(gdb) x/8a 0x555555556a80
0x555555556a80: 0xffffe8a5ffffe89e 0xffffe8faffffe8f3
0x555555556a90: 0xffffe908ffffe901 0xffffe916ffffe90f
0x555555556aa0 <array.3415>: 0xa00000002 0x100000006
0x555555556ab0 <array.3415+16>: 0x100000000c 0x300000009
(gdb) x/s $r8
0x7ffff7ff7006: "8 16 32\no give Tina Fey more material.\n"
(gdb) x/s $r12
0x555555554fe0 <_start>: "15I11^H12H340PTL5[=11=]520"
(gdb) x/s $r13
0x7fffffffe060: "[=11=]1"
(gdb) x/s $rip
0x5555555552cd <phase_3>: "H340dH3[=11=]4%("
- 您在该位置放置了一个断点。要继续使用
stepi
/nexti
或设置另一个断点。请注意,调用是对sscanf
的调用,它使用字符串源。到那时你的输入已经从标准输入中读取,它作为参数传递给这个函数。 - +65 到+72 是开关,由于额外添加,它只是分成几个部分。
- 您的反汇编程序的友好服务。它显示了实际计算的地址,因此您不必弄清楚例如什么。
0x1a05(%rip)
会。 *
表示at&t语法中的间接跳转。jmp *%rax
是 "jump to the address stored in rax"。需要区分jmp foo
和jmp *foo
。寄存器操作数是明确的,但仍然使用符号(gas
否则会发出警告)。- 并非所有值都在内存中。例如,要打印寄存器,您必须使用
p
。您也可以使用p
通过取消引用来打印内存内容,但x
更灵活用于此目的。
如果您在 Binary Ninja 或 IDA pro 等反汇编程序中查看二进制文件,它会显示 switch 语句的地址。