CTF中用到的linux命令(补充中)

checkesc 检测文件是否开启了什么保护
chmod 777 +文件名 给文件可读可写可执行权限

汇编语言的基础(补充中)

简要认识汇编

mov rbp(目的操作数),rsp(原操作数)
将rsp寄存器的值赋值给rbp
简单来说就是rnp=rsp;

add加,sub减,xor异或,and&与操作,call直接调函数.

lea 计算
eg:
lea rax,[rbp-0x18] <==> rax=rbb-0x18;
(xor eax ,eax :eax=0;)

jcc系列–满足一定条件跳转

cmp a1,0x61 : a1-0x61给下面的Jcc系列的语句作为跳转判断的条件.
与sub a1,0x61区别: a1=a1-0x61而前者没有赋值直接比较

test 与上面同理,比如rax&rax=1一样只不过没有赋值

关于pop与push
1、push是什么?(推进)

push就是推,延伸为推进.这个它是汇编的一个指令
就是把一个元素放入栈中.你可以假想栈是一个放光盘的那种盒子,有底没盖,先push进去的光盘总是要等后push进去的出来后才能出来.

2、pop是什么?(弹出)

pop和push相反,它的意思是弹出,就是从栈里弹出一个元素,每次弹出的都是栈顶(光盘盒最上面那个,也就是最后放进去的那个)的那个元素.

系统理解汇编

在一段程序中,或者说在我们GDB调试的过程中,有三个寄存器rsp(esp),rbp(ebp),rip(eip),是我们尤为关注的.rsp指向栈底,rbp指向栈顶.rip则是程序执行指令的当前位置.所以我们计算偏移地址时可以是[rbp-0x…]也可以是[rsp+0x…].那我怎么知道我是用这块内存时别人不去调用这块内存呢?其实有一套配套的指令:

1
2
3
4
5
6
7
8
9
10
   call (push eip,jmp)
push ebp//把esp放入esp指向的地方,esp-4
mov ebp esp
/|\
| //相反的效果
\|/
leave (mov esp ebp)
pop ebp//把esp指的地方赋值给ebp,esp+4
ret(pop eip)

综上,通过3个指针寄存器,我们可以了解汇编在函数调用的作用,注意到如果rbp在函数内即将指向函数的返回地址时,这时我们有一个思路:

假如在main函数中并没有后门函数的调用我们可将其中调用函数的返回地址覆盖为后门函数的地址即可get shell.

GDB(补充中)

gdb ./文件名–启动!
run–我觉得一般用不到,这相当于跑了一遍全过程
start–程序启动!
ni–单步步进,用来分析寄存器的变化
finish 如果进入到某个函数里,步过这个函数

b *地址设置断点
enable/disable 启动/禁用断点
c 执行到断点所在的地址,指向的那一行没有被执行

x/数字+.. +$… 系列
x/i以汇编的形式实现(x/20i $rip)
x/g以8个字节的形式呈现(x/20g $rbp)–十六进制
x/w以4个字节的形式呈现(x/20w $rbp)–十六进制
x/bd以十进制形式呈现(x/20bd $rbp)
x/s以字符形式呈现(x/20s $rbp)

set 系列(赋值)

set $rbp=10可以给寄存器赋值

pwndbg:
vmmap 在断点后,使用r运行后,运行vmmap可以查看当前程序的系统调用库,获取调试进程中虚拟地址的范围等.

IDA–世界上最强大的反编译调试工具–不接受反驳

除了F5反编译外,更多是要看TA的程序执行流程图
小技巧:
选中一段函数按TAB键,可以直接跳转到call函数的汇编代码
右键点copy to assembly方便查看
set call type在看参数时好用
shift+F12 可以看到所有字符

函数的调用约定

__cdecl: C/C++默认方式,参数从右向左入栈,主调函数负责栈平衡.

__stdcall:windows API默认方式,参数从右向左入栈,被调函数负责栈平衡.

__fastcall:快速调用方式.所谓快速,这种方式选择将参数优先从寄存器传入(ECX和EDX),剩下的参数再从右向左从栈传入.因为栈是位于内存的区域,而寄存器位于CPU内,故存取方式快于内存m,故其名曰”__fastcall”.