NCTF RE

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值