tmxklab
2020 DamCTF - schlage(rev) 본문
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