RTC
·
Wargame/HackCTF
https://jiravvit.tistory.com/entry/RTC-Return-to-CSU 자료를 참고하여 익스플로잇을 진행했다. rtc 바이너리의 가젯을 찾아보니 pppr에 해당하는 가젯이 없다. 따라서 RTC 기법을 통해 해당 가젯을 이용할 수 있게끔 문제 풀이를 진행했다. 코드는 간단한다. read 함수에서 BOF -> ROP를 통해 system 함수를 실행시키면 된다. 다만 마땅한 gadget이 없어서 문제인데, libc_csu_init 부분에서 얻었다. 페이로드를 작성할 땐 csu_init -> csu_call 순으로 작성한다. 링크를 참조하면 무슨 값을 각각 넣어야하는 지 잘 나와 있다. 다만, 짚고갈 포인트는 다음과 같다. r13을 rdx로, r14를 rsi로, r15d를 edi로 옮긴다..
ROP
·
Wargame/HackCTF
read함수에서 BOF가 터진다. 바이너리 파일 안에 system, write, read 함수가 존재하므로 이 함수들을 이용해 ROP를 진행해보자. 코드를 짜기 전 알아둬야할 점을 짚어보자. // read Function ssize_t read (int fd, void *buf, size_t nbytes) // write Function ssize_t write (int fd, const void *buf, size_t n) 두 함수 모두 fd(디스크립터)를 이용한다. 파일 디스크립터(fd)설명 0표준 입력 1표준 출력 2표준 에러 출력 3open함수로 순차적으로 할당 fd값이 0이면 입력, 1이면 출력이다. 함수의 흐름을 ROP로 제어하는데 시나리오는 다음과 같다. 1. ASLR이 걸려있기 때문에 실제..
Gift
·
Wargame/HackCTF
gdb-peda$ checksec CANARY : disabled FORTIFY : disabled NX : ENABLED PIE : disabled RELRO : disabled main 함수의 gets 부분이 핵심이다. 이를 통해 BOF를 진행한다. $ ./gift Hey guyssssssssss here you are: 0x8049940 0xf7dbc3d0 $ ./gift Hey guyssssssssss here you are: 0x8049940 0xf7e183d0 바이너리를 실행시킬 때마다 system 값의 주소가 변한다. ASLR이 걸려있는 것을 확인. ( binsh 부분의 주소는 bss영역의 시작 주소이다. bss 영역이므로 주소 변화가 없음 ) system 주소를 Leak해서 익스플로잇을 진..
Look at me
·
Wargame/HackCTF
gdb-peda$ checksec CANARY : disabled FORTIFY : disabled NX : ENABLED PIE : disabled RELRO : Partial NX bit가 걸려있고 쉘 딸 수 있는 함수가 없다. 기존에 풀던 방식인 execve 함수나 system함수를 이용하는 게 아닌 mprotect 함수를 이용한다. mprotect 참고 자료 : https://hg2lee.tistory.com/entry/%EC%8B%9C%EC%8A%A4%ED%85%9C-mprotect-ROP mprotect 함수가 강력한 이유는 NX bit 보호기법이 걸려있음에도 불구하고 bss 영역에 쉘코드를 저장해놓은 후, mprotect로 해당 주소를 접근해 실행 권한을 줄 수 있기 때문이다. mprotec..
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..