Start

checksec

Arch:     i386-32-little
RELRO:    No RELRO
Stack:    No canary found
NX:       NX disabled
PIE:      No PIE (0x8048000)

程序只有两个函数

_start

_exit

_start函数

.text:08048060                 push    esp  # 将esp寄存器的值压入栈中,程序一开始什么都没有,esp就是栈顶
.text:08048061                 push    offset _exit # 将_exit函数地址压入栈中,使得_start函数执行完毕时返回_exit函数
.text:08048066                 xor     eax, eax # 异或,使eax寄存器值为零
.text:08048068                 xor     ebx, ebx # 异或,使ebx寄存器值为零
.text:0804806A                 xor     ecx, ecx # 异或,使ecx寄存器值为零
.text:0804806C                 xor     edx, edx # 异或,使edx寄存器值为零,都是初始化操作
.text:0804806E                 push    3A465443h # 将'CTF:'压入栈
.text:08048073                 push    20656874h # 将'the '压入栈
.text:08048078                 push    20747261h # 将'art '压入栈
.text:0804807D                 push    74732073h # 将's st'压入栈
.text:08048082                 push    2774654Ch # 将"Let'"压入栈
.text:08048087                 mov     ecx, esp        ; addr # ecx存用于指向需要打印字符串的起始地址
.text:08048089                 mov     dl, 14h         ; len  # edx存打印字符串的长度
.text:0804808B                 mov     bl, 1           ; fd   # ebx存fd,1为文件描述符,指的是屏幕显示
.text:0804808D                 mov     al, 4                  # eax存函数调用号,0x04是write函数的调用号
.text:0804808F                 int     80h             ; LINUX - sys_write # 调用80中断
.text:08048091                 xor     ebx, ebx # 异或,使ebx寄存器值为零
.text:08048093                 mov     dl, 3Ch  # 使edx值为0x3C,存储输入的长度
.text:08048095                 mov     al, 3    # eax存函数调用号,0x03是read函数的调用号
.text:08048097                 int     80h             ; LINUX - # 调用80中断
.text:08048099                 add     esp, 14h # 恢复栈平衡,使栈顶指针回归程序一开始的位置,就是加20,因为栈增长时,地址会越来越小
.text:0804809C                 retn

程序执行的流程

───────────────────────────────────────────────[ STACK ]───────────────────────────────────────────────
00:0000│ esp  0xffffcfe0 ◂— 0x1

esp寄存器地址为0xffffcfe0,esp寄存器的值是0x1,即*esp = 0x1

───────────────────────────────────────────────[ STACK ]───────────────────────────────────────────────
00:0000│ esp  0xffffcfdc —▸ 0xffffcfe0 ◂— 0x1
01:0004│      0xffffcfe0 ◂— 0x1

esp寄存器地址为0xffffcfdc,esp寄存器的值是0xffffcfe0,即

esp = 0xffffcfdc, *esp = 0xffffcfe0 = esp + 4