南邮CTF逆向题第二道ReadAsm2解题思路

来源:互联网 发布:淘宝账号登陆不了 编辑:程序博客网 时间:2024/06/05 15:27

首先看下提示



分析main函数 可以发现主要功能还是在于func函数中 于是我们仔细看func函数

00000000004004e6<func>:;4004e6一列表示该指令对应的虚拟内存地址 55一列为该指令对应的计算机指令

4004e6:55push rbp ;入栈,将寄存器的值压入调用 bp栈中

4004e7:4889 e5 mov rbp,rsp;建立新栈帧,别掉函数栈帧栈底地址放入寄存器

4004ea:48897d e8 movQWORDPTR[rbp-0x18],rdi;对应maininput[]这时i=0 //[rbp-0x18] = input[0]

4004ee:8975 e4 movDWORDPTR[rbp-0x1c],esi;放入28 //[rbp-0x1c] = 28

4004f1: c745 fc 01000000movDWORDPTR[rbp-0x4],0x1;首先将0x1赋值给[rbp-0x4] //i = 1

4004f8: eb28jmp400522<func+0x3c>;接着跳转到400522的位置 //for(i=1;i<=28;i++) 下面以第一次过程为例

4004fa:8b45 fc moveax,DWORDPTR[rbp-0x4];[rbp-0x4]的值赋给eax寄存器 //即令eax=i =1

4004fd:4863 d0 movsxd rdx,eax;eax的值带符号扩展,并传送至rdx //即令rdx=eax =i =1

400500:488b45 e8 mov rax,QWORDPTR[rbp-0x18];rax的值给input[0] //即令rax = input[0] =[rbp-0x18]

400504:4801 d0 add rax,rdx;rdx的值加上rax再赋值给rax // rax=input[1] =i+input[0] =rdx+rax

400507:8b55 fc movedx,DWORDPTR[rbp-0x4];[rbp-0x4]的值给edx //即令edx=i =1

40050a:4863 ca movsxd rcx,edx;edx的值带符号扩展,并传送至rcx //即令rcx=i =1

40050d:488b55 e8 mov rdx,QWORDPTR[rbp-0x18];[rbp-0x18]的值给rdx //即令rdx=[rbp-0x18] =input[0]

400511:4801 ca add rdx,rcx;rcx的值加上rdx再赋值给rdx //i++ rdx=input[1]

400514:0f b6 0amovzxecx,BYTEPTR[rdx];rdx无符号扩展,并传送至ecx //ecx=chr(rdx) =chr(input[0])

400517:8b55 fc movedx,DWORDPTR[rbp-0x4];edx = [rbp-0x4] //edx=i =1

40051a:31 ca xoredx,ecx;edxecx异或 //i^input[0]

40051c:8810movBYTEPTR[rax],dl;rax = dl

40051e:8345 fc 01addDWORDPTR[rbp-0x4],0x1;[rbp-0x4]++ //i++

400522:8b45 fc moveax,DWORDPTR[rbp-0x4];[rbp-0x4]的值赋给eax寄存器 //eax = i

400525:3b45 e4 cmpeax,DWORDPTR[rbp-0x1c];[rbp-0x1c]中的值与eax值比较第一次就是28

400528:7e d0 jle4004fa<func+0x14>;如果<=那么就跳到4004fa //if eaxi <=28跳到4004fa继续循环

40052a:90nop;空指令

40052b:5dpop rbp ;出栈

40052c: c3ret;ret相当于return

 

 

分析可得Python3代码:

a = [0x0, 0x67, 0x6e, 0x62, 0x63, 0x7e, 0x74, 0x62, 0x69, 0x6d, 0x55, 0x6a, 0x7f, 0x60, 0x51, 0x66, 0x63, 0x4e, 0x66, 0x7b, 0x71, 0x4a, 0x74, 0x76, 0x6b, 0x70, 0x79, 0x66 , 0x1c] s = '' for i in range(1,len(a)): s += chr(a[i]^i) print (s)

运行结果如下:

 

 

 

 

C语言代码:

void func(char input[],int num){int i = 1;while(i <= num){*(input[0]+i) ^= i;i++;}}

 

 

推荐看下这篇 指令讲解的很棒

https://www.cnblogs.com/Chesky/p/nuptzj_re_writeup.html

关于x86-64寄存器

http://www.360doc.com/content/14/0428/09/9408846_372826893.shtml