checksec
Arch: i386-32-little
RELRO: No RELRO
Stack: No canary found
NX: NX disabled
PIE: No PIE (0x8048000)
程序只有两个函数
_start
_exit
.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