一直没能好好掌握汇编知识, 始终是心中的一块痛, 这不每次都需要临时抱佛脚.
之前注册了 KCTF, 但一直没顾上看, 昨天发现已经接近尾声了, 一声长叹!
虽然尾声, 但还是可以参与一下的, 重在参与嘛, 于是就看看了它的签到题.
签到题
第一个签到题, 就是关于序列号破解的, 一个 exe 文件, 要求获取指定用户名的序列号.
地址: https://ctf.pediy.com/game-season_fight-112.htm
很明显需要对 exe 进行反编译了, 这种反编译一般都需要有汇编语言的知识才可以的, 否则对着一堆机器码只能望洋兴叹.
image.PNG
汇编语言摘要
参考网站: http://c.biancheng.net/view/3566.html
基于零标志位, 进位标志位, 溢出标志位, 奇偶标志位和符号标志位的跳转
助记符 | 说明 | 标志位 / 寄存器 | 助记符 | 说明 | 标志位 / 寄存器 |
---|---|---|---|---|---|
JZ | 为零跳转 | ZF=1 | JNO | 无溢出跳转 | F=0 |
JNZ | 非零跳转 | ZF=0 | JS | 有符号跳转 | SF=1 |
JC | 进位跳转 | CF=1 | JNS | 无符号跳转 | SF=0 |
JNC | 无进位跳转 | CF=0 | JP | 偶校验跳转 | PF=1 |
JO | 溢出跳转 | OF=1 | JNP | 奇校验跳转 | PF=0 |
基于相等性评估的跳转指令.
有些情况下, 进行比较的是两个操作数; 其他情况下, 则是基于 CX,ECX 或 RCX 的值进行跳转. 表中符号 leftOp 和 rightOp 分别指的是 CMP 指令中的左 (目的) 操作数和右 (源) 操 作数:
助记符 | 说明 |
---|---|
JE | 相等跳转 (leftOp=rightOp) |
JNE | 不相等跳转 (leftOp M rightOp) |
JCXZ | CX=0 跳转 |
JECXZ | ECX=0 跳转 |
JRCXZ | RCX=0 跳转(64 位模式) |
CMP leftOp,rightOp
无符号数比较
基于无符号数比较的跳转如下表所示. 操作数的名称反映了表达式中操作数的顺序(比如 leftOp < rightOp). 下表中的跳转仅在比较无符号数值时才有意义. 有符号操作数使用不同的跳转指令.
助记符 | 说明 | 助记符 | 说明 |
---|---|---|---|
JA | 大于跳转(若 leftOp > rightOp) | JB | 小于跳转(若 leftOp < rightOp) |
JNBE | 不小于或等于跳转(与 JA 相同) | JNAE | 不大于或等于跳转(与 JB 相同) |
JAE | 大于或等于跳转(若 leftOp ≥ rightOp) | JBE | 小于或等于跳转(若 leftOp ≤ rightOp) |
JNB | 不小于跳转(与 JAE 相同) | JNA | 不大于跳转(与 JBE 相同) |
有符号数比较
下表列岀了基于有符号数比较的跳转. 下面的指令序列展示了两个有符号数值的比较:
助记符 | 说明 | 助记符 | 说明 |
---|---|---|---|
JG | 大于跳转(若 leftOp > rightOp) | JL | 小于跳转(若 leftOp < rightOp) |
JNLE | 不小于或等于跳转(与 JG 相同) | JNGE | 不大于或等于跳转(与 JL 相同) |
JGE | 大于或等于跳转(若 leftOp ≥ rightOp) | JLE | 小于或等于跳转(若 leftOp ≤ rightOp) |
JNL | 不小于跳转(与 JGE 相同) | JNG | 不大于跳转(与 JLE 相同) |
来源: http://www.jianshu.com/p/9934b7714277