写的很乱
1.c语言的运行过程
了解了c语言需要经过以上2个过程(编译和汇编),才能让机器按指令运行。机器只能听得懂机器码,所以要“汇编”。
那问题就来了,“编译”这个动作有啥用,c语言这种高级语言,直接进行汇编,变成机器码不更快嘛
ai回答
虽然直接将C语言汇编为机器码可能会获得更高的性能,但编译过程中的汇编步骤可以提供更好的可移植性、开发效率、优化能力以及代码可读性与可维护性。因此,大多数情况下,我们使用C语言编译为汇编代码再生成机器码,以平衡性能和开发效率之间的权衡。
IDA的作用就是反汇编和反编译(你按f5就是反编译),要是想理解反汇编,那就去查表,比如0x55就是push ebp,这样一一对应的关系。
但是反编译的原理好像就难了
2.大端序和小端序
老师讲的这个,我大概理解了,就是大多数据是怎么存放的,大多栈的数据都是低地址对应数据地位,就跟图小端序一样。大端序很少见
也就是你按顺序输入的0A0B0C0D,压入栈后就变成了,0D先压进去,然后一次。。。
3.IDA小技巧,看c语言的汇编代码。右键之后acc
就比如,这是main函数的反编译后的代码
如果你想看他的反汇编代码那就
按空格,显示text格式
5.本地调试+远程调试+静态分析
产看
调试
发送
写法也可以是p32(0)+b"45fafasdfsd"
远程调试
先直接简单运行一下,也可以看出他的作用,就是把大写的I边成了you
然后我们在gdb里面运行调试,我这里安装了pwndbg的插件,pwn神给的ubuntu
堆入门系列(2)之gdb动态调试_gdb查看heap-CSDN博客
打个断点b main
b就是break的简写,使用方式有b *0x004800(*加地址)
或者 b main(加一个函数)
清楚断点是
然后运行,用run或者简写的r都可以运行
输入n继续往下查看,就是next的意思
n 执行下一条指令 ni步入
找到漏洞函数后
s step,si单步步进,然后按n运行,之后stack 24
使用vmmap直接查看该进程的内存空间
RIP 存放当前执行的指令的地址
RSP 存放当前栈帧的栈顶地址
RBP 存放当前栈帧的栈底地址
RAX 通用寄存器。存放函数返回值
6.strings的使用可以更快的查看可见字符,直接搜flag
我没有例题,但是用法就是,就是如果你shift+f12能看见的,strings就能搜到
7.file也可以看32位还是64位
9.setvbuf()关闭缓冲区,作用是使你更快的运行程序,所以看见就不用管
10.动态调试是为了防止出题人在静态文件中恶意修改变量的存储空间
12.PIE保护BSS缓冲区的地址,ASLR保护text和data的缓冲区的地址。
怎么保护呢,就是没次运行,让你的标识的地址不一样,地址随机偏移一位两位的
13.多个地址为什么能成功