目录
二、pwn66(简单的shellcode?不对劲,十分得有十二分的不对劲)
前言
做起来比较吃力哈哈,自己还是太菜了,学了一些新的知识,记录一下。
一、pwn65(你是一个好人)
先checksec一下:
┌──(kali㉿kali)-[~/桌面/ctfshoww]
└─$ checksec --file=pwn65
[*] '/home/kali/桌面/ctfshoww/pwn65'
Arch: amd64-64-little
RELRO: Full RELRO
Stack: No canary found
NX: NX unknown - GNU_STACK missing
PIE: PIE enabled
Stack: Executable
RWX: Has RWX segments
Stripped: No
真的感觉保护得好好的,还用了PIE,看一看代码吧。
main函数的看不了,只能瞅瞅汇编代码了。
映入眼帘的一个超大缓冲区用来存用户输入的shellcode。
.text:00000000000011BB cdqe
.text:00000000000011BD movzx eax, [rbp+rax+buf]
.text:00000000000011C5 cmp al, 60h
.text:00000000000011C7 jle short loc_11DA
.text:00000000000011C9 mov eax, [rbp+var_4]
.text:00000000000011CC cdqe
.text:00000000000011CE movzx eax, [rbp+rax+buf]
.text:00000000000011D6 cmp al, 7Ah
.text:00000000000011D8 jle short loc_1236
特别注意下面的类似的代码,cdqe 是一条指令,它的作用是将 32 位寄存器 EAX 的值扩展到 64 位寄存器 RAX 中。具体来说,它会将 EAX 的值符号扩展到 RAX,即保留 EAX 的符号位,并填充到 RAX 的高 32 位。
mov eax, [rbp+var_4]:将 var_4 的值加载到 EAX 中。
mov eax, [rbp+var_4]
cdqe
movzx eax, [rbp+rax+buf]
cdqe:将 EAX 的值符号扩展到 RAX,确保 RAX 是一个 64 位的地址。
movzx eax, [rbp+rax+buf]:将 buf 缓冲区中偏移为 RAX 的字节加载到 EAX 中,并将结果零扩展到 32 位。
另外:
检查读取结果
.text:000000000000119C cmp [rbp+var_8], 0
.text:00000000000011A0 jg short loc_11AC
.text:00000000000011A2 mov eax, 0
.text:00000000000011A7 jmp locret_1254
如果读取的字节数大于 0,程序跳转到 loc_11AC 继续执行;否则直接返回。
.text:000000000000119C cmp [rbp+var_8], 0
.text:00000000000011A0 jg short loc_11AC
.text:00000000000011A2 mov eax, 0
.text:00000000000011A7 jmp locret_1254
如果读取的字节数大于 0,程序跳转到 loc_11AC 继续执行;否则直接返回。
字符范围检查
检查当前字符 AL 是否在范围 0x60 - 0x7A(小写字母 a 到 z)内:
如果 AL <= 0x60,跳转到 loc_11DA。
如果 AL <= 0x7A,跳转到 loc_1236(继续检查下一个字符)。
如果当前字符不在范围 0x60 - 0x7A 内,检查是否在范围 0x40 - 0x5A(大写字母 @ 到 Z)内:
如果 AL <= 0x40,跳转到 loc_11FC。
如果 AL <= 0x5A,跳转到 loc_1236(继续检查下一个字符)。
如果当前字符不在范围 0x40 - 0x5A 内,检查是否在范围 0x2F - 0x5A(/ 到 Z)内:
如果 AL <= 0x2F,跳转到 loc_121E。
如果 AL <= 0x5A,跳转到 loc_1236(继续检查下一个字符)。
如果字符不在任何允许的范围内,程序会输出 "Good, but not right" 并退出。
这个就是大致流程,但是这个shellcode该怎么写呢,看了大佬的做法要使用 alpha3 工具生成只包含可打印字符的 Shellcode。alpha3 可以将原始 Shellcode 编码为只包含特定字符集的版本。结合载有deepseek r1-14b的星见雅的做法,试着写了一下。由于工具安装失败,所以就试了试可视的shellcode当然要用64位那个。


341

被折叠的 条评论
为什么被折叠?



