WriteUp/HackCTF

    HackCTF - basic_fsb

    HackCTF - basic_fsb

    main 함수를 IDA에 넣어보았다. vuln() 도 보자 snprintf의 존재를 잘 모르겠다. 알아보자 버퍼에 복사하는 거라고 한다. 여기서는 s에 있는 값을 format으로 가져오는 거겠지. 0x400만큼. 사이즈가 정해져있다는 점이 중요하다. 버퍼 오버플로우는 사용할 수 없다는 뜻. 일단 넣어주면 1023개 출력해준다. 0x400에서 그만큼 가져오니까 그런것도 있고, snprintf에서 그렇게 출력해주는 이유도 있겠지.

    Misc : DNA

    Misc : DNA

    GTCATAATGCCGGGACTTGGT{ACATTC_CAGAAAAAAATT_GGCTATTCT} 해당 값이 flag 이겠다. flag 형식이 HackCTF 이기 때문에 ascii를 순서대로 대입한건가…? 싶어서 일일히 해봤는데 이상한 값이 나와서 아닌것 같았다. 순서대로 이루어지지는 않았던 것 같다. => 난 ATGC 순서로 줄 세웠는데 ACGT 순서였다. 그래서 이상하게 나왔나보네 그런데 구글링 해보니까 DNA 코드랑 알파벳이랑 대응시켜놓는 테이블이 있었다. 그럼 코드가 다음과 같이 나온다. GTC ATA ATG CCG GGA CTT GGT {ACA TTC _ CAG AAA AAA ATT _ GGC TAT TCT } TmowOFR{e0_saap_PZ4} 이게 Flag 형식과는 맞지 않는다. HackCTF..

    Pwnable : ROP

    Pwnable : ROP

    nc ctf.j0n9hyun.xyz 3021 Return Oriented Programming 이다. RTL chaining 과 GOT overwrite 를 잘 이용해서 해보도록 하자. 일단 main 문은 상당히 심플하다. int __cdecl main(int argc, const char **argv, const char **envp) { vulnerable_function(); write(1, "Hello, World!\n", 0xEu); return 0; } vulnerable_function()을 볼까? ssize_t vulnerable_function() { char buf; // [esp+0h] [ebp-88h] return read(0, &buf, 0x100u); } 일단 read 랑 wri..

    RTL_Core

    RTL_Core

    nc ctf.j0n9hyun.xyz 3015 32비트 환경이다. 한번 실행을 해보자. NX 가 걸려있는 것을 확인할 수 있다. RTL 을 사용하는 조건이겠지? 문제 이름이 RTL Core 이기 때문이다. 함수가 뭐있는지도 확인해보자. 중요해 보이는건 제목에 들어있는 core 함수와, check_passcode 함수가 중요해 보인다. 메인 문을 보자. int __cdecl main(int argc, const char **argv, const char **envp) { char s; // [esp+Ch] [ebp-1Ch] setvbuf(_bss_start, 0, 2, 0); puts(&::s); printf("Passcode: "); gets(&s); if ( check_passcode(&s) == has..

    Forensics : 잔상

    Forensics : 잔상

    이미지 파일이 두개 주어졌다. 언뜻보면 같아보이지만 다르니까 2개를 줬을꺼다. 일단 딱히 뭐 할게 없어서 HxD로 들여다 봤다. 보면 뭐가 다른지 알아야 하지 않겠지 싶어서 해당 기능을 이용해서 차이점을 봤다. 근데 다른 쌍을 하나씩 적어보니까. N / H Q / a I / c c / k ? / C ? / T ... 이런식으로 이어지드라. 누가봐도 flag형식이 아니냐 싶어서 일일히 찾아서 적어봤다. hex값이 보기가 더 편해서 hex 값을 옮겨온 다음 디코드 해줬다. 48 61 63 6b 43 54 46 7b 77 68 33 72 33 5f 40 72 65 5f 79 6f 75 5f 6c 30 30 6b 69 6e 67 3f 7d 디코딩 하면 HackCTF{wh3r3_@re_you_l00king?} 역..

    Pwnable : Random Key

    Pwnable : Random Key

    프로그램을 실행해 보았다. 이런 값이 나오네. gdb로 돌려보자. ㅇㅋ NX 걸려있다. 스택 실행권한 없다. 이제 어떤 함수가 있는지 보자. main문만 잘 보면 될것 같다. 볼까 아 랜덤함수가 눈에 들어온다. 아마도 rand 값이랑 일치하는 값을 찾아줘야 할 것 같다. IDA로 한번 더 볼까? int __cdecl __noreturn main(int argc, const char **argv, const char **envp) { unsigned int v3; // eax int v4; // [rsp+0h] [rbp-10h] int v5; // [rsp+4h] [rbp-Ch] unsigned __int64 v6; // [rsp+8h] [rbp-8h] v6 = __readfsqword(0x28u); se..

    Pwnable : 1996

    Pwnable : 1996

    nc ctf.j0n9hyun.xyz 3013 한번 실행을 해보니 다음과 같이 나온다. 이렇게 입력을 해주면 환경변수 값을 출력을 해주는 것 같다. 대신 해당 이름의 변수가 없어서 출력이 안된 것 같네용 일단 보안옵션은 NX가 있습니다. 스택의 실행권한을 뺏는 옵션이죠 함수 종류도 확인해 보구용 눈에 띄는건 spawn_shell(), main 정도 있구요한번 봅시다잉 음 shell_spawn은 gdb로 안보인다. 이건 ida로 보자. int spawn_shell(void) { char *argv; // [rsp+0h] [rbp-10h] __int64 v2; // [rsp+8h] [rbp-8h] argv = "/bin/bash"; v2 = 0LL; return execve("/bin/bash", &argv,..

    Forensic : Terrorist

    파일을 다운받아보니까 이상한 헤더를 가지고 있다. ftypM4A 이런게 있는데 M4A 파일이라고 한다. 음성 녹음 파일이다. 사진이 아니라 단순히 확장자만 변경해주면 재생이 된다. 진짜 알수없는 소리가 들린다. 편집기로 좀 해보고싶은걸 해봤다. (sonic visualizer 사용) 배속으로 빨리 들어도 보고 뒤집어도 들어봤다. 뭔가 나온다. "미션을 수행하는 요원들에게 알립니다. 다음 테러 목표지점은 서울남산타워입니다." HackCTF{서울남산타워}

    Forensic : Magic PNG

    Forensic : Magic PNG

    파일을 열어보니 당황스럽다. 음 어딘가가 깨져있는 것 같다 파일을 HxD로 확인해 보자. 파일 헤더부분이 잘못되어 있다. PNG 헤더의 첫 8바이트는 89 50 4E 47 0D 0A 1A 0A 이다. 여기는 89 50 4E 47 2E 0A 2E 0A 로 나와있는데 수정해보자. 저장해보니 사진의 일부가 나온다. 다른 부분도 잘못 되어있는것 같으니 확인해보자. PNG 파일에는 반드시 포함되어야 하는 청크가 있는데 IHDR, IDAT, IEND 이다. 3개가 모두 있는지 확인해보자. 10008 블럭부터 idat 로 나와있기 때문에 그 밑에서부터는 사진이 짤려 보이는 것 같다. 수정해주자. 사진이 제대로 나온다. HackCTF{c@n_y0u_$ee_m3?}

    Forensic : 나는 해귀다

    Forensic : 나는 해귀다

    hex 를 뒤집어놓았다고 한다. HxD 로한번 보자. 아 IEND 부분이 나오고 바로 뒷부분에 DNEI 가 나오는 것을 볼 수 있다. 그럼 맨 밑을 보자. PNG 헤더 앞부분도 거꾸로 들어가 있는 것을 확인할 수 있다. 그럼 이부분을 쭉 긁어서 hex 부분만 거꾸로 출력해주면 되겠다. a = "긁은 부분 (너무 길어서 생략)" c = a.split(" ") length = len(c) res="" res1="" for i in range(0,length): res += str(c[length-i-1]) res += " " print(res) 이렇게 쭉 나오는 것을 HxD 에 다시 긁어 넣은 다음 파일을 저장하면 다음과 같이 나온다. 거꾸로 있네 제대로 써보자. HackCTF{Y0u_tu2n3d_th3_$..