pwn基础入门-2

核心gdb-动态调试

image-20240512194027672

进入程序的gdb调试 gdb-程序名

image-20240512194549623

run命令

image-20240512194654534

run:启动命令,就是把程序完全跑一遍

start

image-20240512194952227

start运行到程序的入库点

查看程序运行的位置i r

虽然他知道程序运行到那里了,但是我们不知道,如何查看呢?首先查看寄存器

image-20240512195107263

前16个是一摸一样的,最重要的是rip.

image-20240512195528602

image-20240512195633594

在代码中,我们可以int1知道int100,但是在cpu中能用到只有前15个,并且还有占用,cpu能直接操作的数字都是这些寄存器

查看汇编语言-disassembel

image-20240512200318515

查看main函数的汇编语言

image-20240512200453820

rip较为重要,上面图中就可以查看rip在什么位置 。。。。。275,最上面的一行显示了rip在main函数当中,我的格式没有变,这里就不改变/.gdbinit的内容了

了解汇编指令-mov

一般一个指令后面加一个数或者两个数,一个的就是一个操作指令一个操作数,两个的就是一个操作指令,一个目的操作数,一个是源操作数

image-20240513150859834

mov rbp,rsp :mov就是赋值,就是将rsp的数值赋值给rbp,我们可以走到这个地方,

设置一个断点-b *

image-20240513150840598

查看断点 -i b

如何查看这个断点呢?i b

image-20240513150953904

执行到断点为止-c

image-20240513151127393

再次查看,就可以得知执行到了这个位置

image-20240513151155872

对比赋值前后的结果

i r 查看rsp和rbp的数值,此时是还没有赋值的结果

image-20240513151331681

使用ni命令步入,赋值后的结果就是

image-20240513151437609

image-20240513151503327

此时已经赋值成功。

add是加 sub是减 xor是异或 call是调函数 lea:load effective address :取有效地址,现在大部分的lea是用来计算的

image-20240513152110986

这里的意思就是rbp-0x18=rax

lea命令的执行效果

先设置一个断点

image-20240513152447200

查看断点

image-20240513164233400

执行到断点为止-c

image-20240513164303174

i r 查看赋值之前的效果

image-20240513164352129

执行命令ni

image-20240513152610828

执行过后

image-20240513153222672

lea对比sub

为什么不用sub rbp,0x18而后mov rax,rbp,这是因为lea短,

image-20240513154932675

很明显中间只使用了4行,而一个sub就需要4行

image-20240513155016539

后面再用一个mov指令,可想而知其中的长度。这个指令第一个不用改变rbp的数值,第2,这个指令很短。

xor eax,eax就是eax=0,之所以不写成mov ebx,0是因为前面的比较短,占据内存小

image-20240513155510608

带mov的都是赋值,只不过是赋值形式不同

jcc系列

image-20240513155624938

满足条件跳转,满足什么,需要具体分析。

cmp指令

strcmp也是类似的

约等于sub

cmp al,0x61 :: al-0x61

sub al,0x61::al=al-0x61

两者的区别在于:cmp减完以后不赋值,sub减完以后赋值给al,cmp不存储,是用来和下面的jne进行对比的

jne:结果不为0的时候就跳转

al-0x61不等于0的话就跳转,跳到mov,等于0的时候就不跳转

image-20240513160353573

等于0的时候,就执行func的函数。

步入步过的指令

gdb断点失效--disable b id

image-20240513160950411

可以看到此时已经变成了n而不是y

再打开-enable b 3

image-20240513161031429

可以看到id为3的断点现在又打开了。pwn是不会频繁设置断点的。

ni和si的区别

看效果

先在cal的位置上设置一个断点

image-20240513170646013

查看一下断点

image-20240513170706819

重新启动一下

image-20240513170743219

执行到断点

image-20240513170807709

再查看一下,已经执行到了断点

image-20240513170848101

image-20240513170902628

使用ni是让输入,

而使用si就是进入到put的实现功能当中。

看效果,再次重新启动一下

image-20240513170928519

开始执行

image-20240513170957343

输入si,可以看到进入到了put函数中,再次disassemble $rip,可以查看到的内容是put函数中的

image-20240513171024142

image-20240513165905140

可以使用finish来步出

image-20240513171238012

image-20240513171252680

看到是已经执行完了,步出程序到下一行

  • 34
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值