suaqer 2020-3-2
 举报
想请问一下就是在课程中代码段里面:
      0x8048401  <test+11>        add        eax,  0x1bff
      0x8048406  <test+16>        mov        edx,  dword  ptr  [ebp  +  8]
      0x8048409  <test+19>        mov        eax,  dword  ptr  [ebp  +  0xc]
      0x804840c  <test+22>        add        eax,  edx
      0x804840e  <test+24>        mov        dword  ptr  [ebp  -  4],  eax
  ►  0x8048411  <test+27>        mov        eax,  dword  ptr  [ebp  -  4]

mov        dword  ptr  [ebp  -  4],  eax  这里不是刚把eax的值写入到ebp  -  4么,为什么下一步还要mov        eax,  dword  ptr  [ebp  -  4],再将ebp  -  4中的值返回给eax呢,eax中不已经是3了吗?辛苦啦
【讲师回复】 这个问题问得好,首先eax里面存放的是计算出来的一个值,把他放到ebp-4的意思是存放到局部变量中,再从局部变量中取出来放回eax,这两步是编译器写出来的,编译器不会像人类大脑那样智能,可能会有一些重复性的操作,具体你可以找一本编译原理的书来看看
2020-3-2
Roger 2020-3-2
 举报
@suaqer  而且,您仔细看这个语句,我们做一个假设,假如eax里面存放的是一个字符串的地址,那么ebp-4里面存放的就是eax这个地址所对应的字符串内容,然后再把字符串内容的前四个字节放回到eax中,经过这两步,eax里面存放的数据变化为:地址→地址所对应的内容
suaqer 2020-3-2
 举报
@Roger  谢谢您  这样就清楚多了
hackbs 2020-6-20
 举报
Pwn    学习第二课打卡!

①汇编基础:
32位系统下  X86架构下的汇编指令主要又两种格式  一个是intel    ,一个是AT  &  T
-  Intel架构寄存器              比如:EAX  EBX  ECX  EDX
-  AT  &  T架构寄存器      比如:        %eax  %ebx  %ecx  %edx      $ebx  $ecx  $edx
"配置  Ubuntu  gdb  默认调试架构为Intel的方法"
.gdbinit  =  set  disassembly-flavor  intel
②寄存器
ESP  用来存储函数调用栈的栈顶地址,push  pop  压栈  退栈时候改变
EBP  用来存储当前函数状态的基地址    [函数参数、局部变量位置]
EIP  用来存储即将执行的程序指令的地址
③栈帧
我自己的理解是,栈帧其实就是一个函数执行的环境,就是一个函数执行的时候,他的函数参数、函数的局部变量,函数执行完返回的地址。
wx_榴莲牛奶牛角包 2021-2-15
 举报
@Roger  Hi,  请问一下,在这个例子里面我们用了-m32,但是我们为什么要在64位的平台上编译32位的二进制呢?这样做是为了什么?
【讲师回复】 因为64位调试和32位调试是不一样的,32位程序有32位程序的pwn方法,64位程序有64位程序溢出的办法
2021-2-15
一根油条 2021-3-19
 举报
打卡第二课
pwn萌新 2022-6-16
 举报
老师能帮我解决一下这个吗:
  0xf7fd6c70  <_start>                              mov        eax,  esp
      0xf7fd6c72  <_start+2>                          sub        esp,  0xc
      0xf7fd6c75  <_start+5>                          push      eax
      0xf7fd6c76  <_start+6>                          call      _dl_start                                        <_dl_start>
 
      0xf7fd6c7b  <_start+11>                        add        esp,  0x10
      0xf7fd6c7e  <_dl_start_user>              mov        edi,  eax
      0xf7fd6c80  <_dl_start_user+2>          call      0xf7fd6c60                                        <0xf7fd6c60>
 
      0xf7fd6c85  <_dl_start_user+7>          add        ebx,  0x2637b
      0xf7fd6c8b  <_dl_start_user+13>        mov        eax,  dword  ptr  [ebx  -  0x70c]
      0xf7fd6c91  <_dl_start_user+19>        pop        edx
      0xf7fd6c92  <_dl_start_user+20>        lea        esp,  [esp  +  eax*4]
───────────────────────────────────────[  STACK  ]───────────────────────────────────────
00:0000│  esp  0xffffd500  ◂—  0x1
01:0004│          0xffffd504  —▸  0xffffd67a  ◂—  0x6d6f682f  ('/hom')
02:0008│          0xffffd508  ◂—  0x0
03:000c│          0xffffd50c  —▸  0xffffd69d  ◂—  0x435f534c  ('LS_C')
04:0010│          0xffffd510  —▸  0xffffdc89  ◂—  'LC_MEASUREMENT=zh_CN.UTF-8'
05:0014│          0xffffd514  —▸  0xffffdca4  ◂—  'LESSCLOSE=/usr/bin/lesspipe  %s  %s'
06:0018│          0xffffd518  —▸  0xffffdcc6  ◂—  'LC_PAPER=zh_CN.UTF-8'
07:001c│          0xffffd51c  —▸  0xffffdcdb  ◂—  'LC_MONETARY=zh_CN.UTF-8'
这地址太乱了,也太大了,该怎么修改才能修改到能看的懂的呀