tmxklab

2020 DamCTF - schlage(rev) 본문

CTF 문제

2020 DamCTF - schlage(rev)

tmxk4221 2020. 10. 15. 21:17

1. 문제확인

 

무슨 자물쇠를 푸는 것 같고 pin 1 ~ 5까지 선택할 수 있는데 나중에 보니 pin은 3 → 1 → 5 → 2 → 4 순서대로 문제를 해결하면 된다.

 

1) main()

int __cdecl main(int argc, const char **argv, const char **envp)
{
  puts("*** WELCOME TO THE SCHLAGE 9000 ***");
  puts("***    AUTHORIZED USERS ONLY    ***");
LABEL_8:
  while ( (unsigned __int8)is_lock_unlocked("***    AUTHORIZED USERS ONLY    ***", argv) != 1 )
  {
    print_lock();
    switch ( (unsigned __int64)(unsigned int)get_pin() )
    {
      case 1uLL:
        do_pin1();
        break;
      case 2uLL:
        do_pin2();
        break;
      case 3uLL:
        do_pin3();
        break;
      case 4uLL:
        do_pin4();
        break;
      case 5uLL:
        do_pin5();
        break;
      default:
        goto LABEL_8;
    }
  }
  print_lock();
  puts("Congratulations on opening the lock! I really needed to get back into my apartment.");
  puts("Here, have a flag for your troubles:");
  print_flag();
  return 0;
}

보면은 do_pin1~5()까지 모두 풀면은 flag값을 출력해준다.

 


2. 문제풀이

솔직히 같은 팀원인 형한테 pin 3, 1, 5, 2번을 풀어놔서 pin 4번만 해결했다. 걍 리버싱 좀 하고 코딩하면 된다.

 

 

do_pin4()의 일부인데 저기서 fgets로 s변수에 값을 넣는데 v3값과 입력 값 1byte씩 xor한 값의 합이 0x123이 나오면 된다. do_pin4()를 풀기 전에 do_pin2()에서 우리가 seed값을 설정했으므로 랜덤 값을 알 수 있으니깐 걍 코딩만 잘 짜면 풀 수 있당.

 

 

익스코드)

from pwn import *
from ctypes import *
from ctypes.util import find_library

context.log_level = "debug"

libc = CDLL(find_library('c'))
#p = process("./schlage")
p = remote("chals.damctf.xyz", 31932)

# pin3
p.sendlineafter("open?\n", str(3))
p.sendlineafter("number!\n", str(3449466328))

# pin1
p.sendlineafter("open?\n", str(1))
p.sendlineafter("please!\n", str(99))

# pin5
p.sendlineafter("open?\n", str(5))
p.sendlineafter("number!\n", str(1413036362))

# pin2
p.sendlineafter("open?\n", str(2))
p.recvuntil("means?\n")

seed = p.recvuntil("\n")[:-1]
log.info(seed)
libc.srand(int(seed))

p.sendlineafter("number?\n", str(libc.rand()))

# pin4
p.sendlineafter("open?\n", str(4))
#gdb.attach(p)
random_val = libc.rand() % 10 + 0x41
log.info(hex(random_val))

v1 = 0x123

payload = []

for i in range(5):
    data = int(random_val) ^ 58
    payload.append(p8(data))

data = int(random_val) ^ 1
payload.append(p8(data))
payload = ''.join(payload)
log.info(payload)

p.sendlineafter("sentence?\n", payload)

p.interactive()

 

실행결과)

'CTF 문제' 카테고리의 다른 글

2021 DiceCTF - babymix(rev)  (0) 2021.02.09
2020 DamCTF - side-channel(misc)  (0) 2020.10.15
2020 DamCTF - allokay(pwn)  (0) 2020.10.15
2020 DamCTF - ghostbusters(pwn)  (2) 2020.10.15
2020 DownUnderCTF - [misc] homepage  (0) 2020.09.21
Comments