1、pwn6
立即寻址方式结束后eax寄存器的值为?
截取关键代码
; 立即寻址方式
mov eax, 11 ; 将11赋值给eax
add eax, 114504 ; eax加上114504
sub eax, 1 ; eax减去1
mov 用于赋值,将右边立即数加载到左边的寄存器 eax 中;
add 将寄存器 eax 中的值与立即数 114504 相加,并将结果存储回寄存器eax中;
sub 从寄存器eax中的值中减去1,并将结果存储回寄存器eax中。
简单算一下立即寻址方式结束后eax寄存器的值为:114514
因此 flag 为:ctfshow{114514}
(注意这里的 114514 是十进制,如果是十六进制的话一般会以0x开头的)
我们在 ida 中看看,找到对应代码:
选中使用快捷键 H 将十六进制值转为十进制
如果想转回十六进制,选中,使用快捷键 Q 即可;
此外,如果你想转成二进制,可以选中使用快捷键 B 。
2、pwn7
寄存器寻址方式结束后edx寄存器的值为?
截取关键代码
; 寄存器寻址方式
mov ebx, 0x36d ; 将0x36d赋值给ebx
mov edx, ebx ; 将ebx的值赋值给edx
将立即数0x36d加载到寄存器ebx中;
将寄存器ebx中的值(现在是0x36d)复制到寄存器edx中。
也就是说 edx 中的值也是 0x36d
因此 flag 为:ctfshow{0x36D}
同理我们可以在 ida 中找到对应位置的汇编代码
3、pwn8
直接寻址方式结束后ecx寄存器的值为?
截取关键代码
; 直接寻址方式
mov ecx, msg ; 将msg的地址赋值给ecx
这里只有一个赋值操作,将 msg 的地址赋值给 ecx
找到 ida 中的对应代码
双击跟进 dword_80490E8
可以看到其地址为:80490E8
前面的 0 可以省略,但是这里是十六进制值,我们需要加上 0x
将该地址赋值给 ecx ,所以 flag 为:ctfshow{0x80490E8}
4、pwn9
寄存器间接寻址方式结束后eax寄存器的值为?
截取关键代码
; 寄存器间接寻址方式
mov esi, msg ; 将msg的地址赋值给esi
mov eax, [esi] ; 将esi所指向的地址的值赋值给eax
第一个同上,可以得到 esi 的值为:0x80490E8
但是注意第二个,并不是直接将地址赋给 eax,加了方括号,是告诉处理器要从寄存器 esi 指向的地址中读取数据,因此,这行代码的作用是将 esi 所指向的地址中的数据加载到 eax 寄存器中。
在 ida 中找到对应代码
方括号内部的内容被视为偏移地址,指示了要读取或写入的内存位置
双击跟进,找到其指向地址的值:636C6557h
结尾是 h 也是十六进制,因此 flag 为:ctfshow{0x636C6557}