b站pwn的学习总结

写的很乱

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.多个地址为什么能成功

猜你喜欢

转载自blog.csdn.net/m0_71274136/article/details/134821641
今日推荐