汇编的控制语句
汇编没有像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 的异或变换结果是 Today
s homework is so easy
如上图所示,对字符串变换后会与Tnfb}eu’fgn{b|d0xa3gz6ryjc进行strcmp。根据异或对称的性质,我们所需输入的字符串就为Tnfb}eu'
fgn{b|d0xa3gz6ryjc异或变换的结果,也就是Today`s homework is so easy
成功!
未完待更