汇编的控制语句
汇编没有像C语言一样有着清晰的结构层次,无论是switch、if还是while都是通过cmp,和jmp两种指令来进行控制
常见跳转指令
| 指令名 | 实现功能 |
|---|---|
| ja | 大于时跳转 > |
| jae | 大于等于是跳转 >= |
| jb | 小于时跳转 < |
| jbe | 小于等于时跳转 <= |
| je | 相等时跳转 == |
| jna | 不大于时跳转 <= |
| jnb | 不小于时跳转 >= |
| jnbe | 不小于或等于时跳转 > |
| jne | 不等于时跳转 != |
| jg | 大于(有符号)> |
| jge | 大于等于(有符号) |
| jl | 小于(有符号)< |
| jle | 小于等于(有符号)<= |
| jng | 不大于(有符号)<= |
| jnge | 不大于等于(有符号)< |
| jnl | 不小于 >= |
| jnle | 不小于等于(有符号)> |
| jns | 无符号 |
| jnz | zf非零 |
| js | 如果带符号 |
| jz | zf为0 |
homework.exe

打开exe文件发现要我们进行输入,可通过打印在控制台的文字找到main函数

找到主函数后观察,发现在上面有一串不明字符串,猜测就应该是需要我们输入的flag

如图:该字符串为1
Tnfb}eu'`fgn{b|d0xa3gz6ryjc
跳出输入的时候,我先随意输入了123,F8继续执行
发现会调用strlen()函数,并且与0x1B进行比较
local.4储存着用户输入字符串的长度
转换成C语言 :1
2
3
4if(strlen(str)!=27)
{
printf("tip:27");
}
假如输入的字符串长度不等于27就跳转出去
Tnfb}eu’`fgn{b|d0xa3gz6ryjc 长度就是27,验证猜想,于是输入该字符串

F8继续执行,进入一个循环,local.5是循环控制变量,最后与0x1A比较跳转,因此是循环27次,将字符串中的每个字符都进行xor异或变换

如上图所示,Tnfb}eu’fgn{b|d0xa3gz6ryjc 的异或变换结果是 Todays homework is so easy

如上图所示,对字符串变换后会与Tnfb}eu’fgn{b|d0xa3gz6ryjc进行strcmp。根据异或对称的性质,我们所需输入的字符串就为Tnfb}eu'fgn{b|d0xa3gz6ryjc异或变换的结果,也就是Today`s homework is so easy

成功!
未完待更