16bit
16进制的汇编阅读训练。汇编贼烦,还好师傅手下留情,逻辑段一点不复杂,拖进ida//ida牛逼,查看start函数,跟到sub_100ac下面,看的出来这个是主函数
mov di, 3
call sub_10115
mov di, 24h ; ‘$’
call sub_10123
mov bx, 24h ; ‘$’//输入
add bx, 1
cmp byte ptr [bx], 23h ; ‘#’//不是35个字符gg
jnz short loc_100DD
之后跳转这儿
mov di, 26h ; ‘&’
call sub_100F9
mov si, 76h ; ‘v’
mov dx, 23h ; ‘#’
call sub_100E4//这个是对比,对比输入的跟偏移值位76h的地方的是否相等,相等ok
test ax, ax
jnz short loc_100DD
其中sub_100f9是解释器
进去loc_100FE:
mov al, [bx+si]
mov dl, al
mov cl, 3
shr al, cl//input[i]>>3
mov cl, 5
shl dl, cl//input[i]<<5
xor al, dl//之后抑或操作下
mov [bx+si], al
inc si
cmp si, 23h ; ‘#’
jnz short loc_100FE
之后很明显了,逆向的话就是将原本存在内存中用来对比的//就是加密好的那个先右移3位,再左移5位,之后抑或,贴逆向代码
#include<stdio.h>
int main(){
int a[35]={0xc9,0x68,0x8a,0xc8,0x6f,0x7,0x6,0xf,0x7,0xc6,0xeb,0x86,0x6e,0x6e,0x66,0xad,0x4c,0x8d,
0xac,0xeb,0x26,0x6e,0xeb,0xcc,0xae,0xcd,0x8c,0x86,0xad,0x66,0xcd,0x8e,0x86,0x8d,0xaf};
for(int i=0;i<35;i++){
int front5=0;
int last3=0;
front5=a[i]<<3;
last3=a[i]>>5;
a[i]=front5 ^ last3;
printf("%c",a[i]);
}
2.后门
大水题,找函数,按r,注意xx=0,x0=x,之后就是个换位操作,结束。
3.box
王师傅的box,一开始没做出来的,因为找不到那个数组中的20,后来跟队友闲扯发现有段函数不能伪c,怀疑有猫腻,于是读汇编,贴汇编:
sub_400EB9 proc near ; DATA XREF:.init_array:0000000000601E10↓o
.text:0000000000400EB9
.text:0000000000400EB9 var