CTF-二进制从入门到放弃(一)--汇编与概述

1.文件信息判别 工具:peid、exeinfope DIE 判断运行系统:win/linux 运行位数(32/64) 保护(Pack/ASLR/Nx……) checksec --file= 2.汇编 (1)寄存器    
  X86 x64 作用
标准寄存器 eax rax 返回值
ebx ebx 计次
ecx rcx 计次
edx rdx 计次
edi rdi 字符串指针
esi rsi 字符串指针
ebp rbp 栈底指针
esp rsp 栈顶指针
eip rip opcode指针
    r8-r15 参数
  eax>ax=[ah,al] rax>eax>ax=[ah,al]  
段寄存器 CS\DS\SS\ES\FS\GS 标志寄存器、浮点寄存器 (2)汇编代码 内存:由地址和数据构成 数据表示方式:[eax],[ebp-10] 相当于c的 **(addr) 地址:00401000h,0x401000 mov a,b 赋值 lea a,[addr] a=&*(addr) add/sub/mul/div/idiv 算数运算 and/or/not 逻辑运算 shl/rhl/xor 位运算 cmp/test 比较 jmp/jne/je/jnz/jb/ja…… 各种跳转 call 函数调用 retn 返回 push/pop 参数传入/释放 enter =push ebp, mov ebp,esp leave =mov esp,ebp;pop ebp int3 断点中断 nop 无实际意义 pushad/popad/pushfd/popfd fstp/fadd/fmul/fdiv 等价指令: mov eax,0=xor eax,eax mul eax,4=shl eax,2 call addr=push addr;retn =push nopcode+mov eip,addr push sth=sub esp,0x4 mov [esp],sth pop sth=add esp,0x4 mov sth,[esp] retn=mov eip,[esp] add esp,0x4 (3)反汇编 递归分析与线性分析 (4)调用约定
调用约定 调用场合 入栈方式 栈平衡方式 x86传参 x64
__stdcall win api 参数从右向左依次入栈 被调用函数(内) ———— -------
__cdecl c/c++默认 函数调用者(外) 在栈上 rdi,rsi.rdx,rcx,r8,r9对应前六,其余右往左压栈
__fastcall 高性能 从左开始将不大于4Byte的参数放入ecx,edx,其余从右往左入栈 被调用函数(内) ———— ————
__syscall system ------------- -------- eax为调用编号ebx,ecx,edx,esi,edi,ebp对应前六个参数,其余右往左压栈 rax为调用编号,其他与__cdecl一致
arm程序 r0~r3对应前四个参数,其余右往左压栈
  3.工具的使用 od\ida\ghidra\gdb\x64dbg (1)伪代码判读 即时函数:((返回值类型 (调用约定)(参数类型))函数指针地址)(调用所传递的参数) 函数指针和字符串指针的判读 (2)断点 硬件断点、内存断点、条件断点、int3断点 (3)PE结构 TEB,PEB,TLS,SEH,IAT,EAT 4.保护 (1)内存改写 Inject,Hook,DllHijack (2)反调试 (1)IsDebuggerPresent\CheckRemoteDebuggerPresent\NtQueryInformationProcess\NtQueryObject (2)peb (3)异常处理、TLS (4)时间间隔 GetTickCount、alarm等 (5)进程、窗口句柄、名称 (6)OutPutDebugString漏洞 (7)陷阱标志 (8)虚拟机的检测 (3)花指令 call 00h jmp db push retn push/pop……………… 抵消式 无效式 (4)vm (5)Pack处理 (1)esp定律 (2)内存镜像 (3)单步 下跳上不跳 近进远过 (4)特殊断点法 GetVersion (5)最后一次异常法 (6)代码解析(代码段解码、硬件断点) 5.方法与算法 (1)方法 (1)定位主函数 (2)断点 (3)字符串搜索 (4)栈回溯 (5)OllyScript脚本 (6)直接取字符串 (7)eip截取 (2)算法 (1)异或 (2)Base64 (3)md5/sha1/sha256 (4)RC3/4 (5)DES/AES (6)CRC32 (7)TEA 6.特殊语言调试 如:python(pyc字节码与打包)\c#\vb\delphi\go\e\rust ****Attention***** [1]整数在内存中的数据和自身的十六进制相反 [2]易语言的数组下标起始为1 [3]转义字符,如:\" [4]java运行 java -jar [arg]  
上一篇:CTF—MISC—USB键盘流量分析


下一篇:CTF命题思路