<Wargame & CTF> 42

[Pwnable.kr] horcruxes

#Pwnable.kr #horcruxes #Toddler horcruxes 문제이다. main 함수를 보면 다음과 같이 seccomp 설정과 더불어 init_ABCDEFG() 함수가 실행된다. 해당 init_ABCDEFG() 함수는 위와 같은데 /dev/urandom 에서 랜덤한 값을 시드로 하여 a, b, c, d, e, f, g 값을 랜덤으로 뽑아내는 함수이다. 그리고 핵심이라 할 수 있는 ropem 함수이다. 해당 함수는 위와 같이 생겼는데, A(), B(), C(), D(), E(), F(), G() 함수는 init_ABCDEFG 에서 만든 값들을 알파벳에 맞게 차례로 출력시켜주는 함수이다. 그리고 그 값들을 합친 sum 이 gets(s) 로 입력받은 s 값과 같으면 플래그를 출력시켜준다. 처음에..

[Pwnable.kr] asm

#Pwnable.kr #asm #Toddler asm 문제는 shellcode 를 제작하는 문제이다. 접속을 해서 readme 파일을 읽어보면, 원격지에 로컬에서와 같은 이름의 플래그 파일이 있고 읽어보라는.. 그런 내용이다. # asm.c #include #include #include #define LENGTH 128 void sandbox(){ scmp_filter_ctx ctx = seccomp_init(SCMP_ACT_KILL); if (ctx == NULL) { printf("seccomp error\n"); exit(0); } seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(open), 0); seccomp_rule_add(ctx, SCMP_ACT_ALLO..

[Pwnable.kr] memcpy

#Pwnable.kr #memcpy #Toddler memcpy 문제이다. 해당 코드를 컴파일하여 실행해보면, 위 처럼 heap 에 할당할 크기를 입력받고 자체적으로 개발한 memcpy 함수 두 개를 실행한다. 참고로, 해당 memcpy 함수는 slow_memcpy 와 fast_memcpy 이다. 아무튼 저렇게 입력 값을 주면 계속해서 slow_memcpy 와 fast_memcpy 를 실행하다가 128 값에서 프로그램이 Segmemtation fault 를 내뿜으면서 종료된다. 디버깅으로 알아보면, 위 부분에서 메모리에 데이터를 제대로 전달하지 못하고 꺼진다. movntps 어셈블리 명령어를 알아보면 What is movntps??? Description Moves the packed single-pre..

[Pwnable.xyz] fclose

fclose #FSOP ![fclose_prob](https://i.imgur.com/E6VL7Mo.png 문제 설명은 다음과 같다. ) 보호기법은 NX 만 걸려있다. 해당 문제는 fclose 함수에서 vtable 을 이용해 특정함수로 jump 하는 특징을 이용하는 문제이다. 소스분석 및 취약점 부분 탐색 int __cdecl main(int argc, const char **argv, const char **envp) { setup(); printf("> ", argv); read(0, &input, 1028uLL); fclose(&input); return 0; }int win() { return system("cat flag"); }중요 소스는 이게 전부이다. 얼핏 보기에도 1028 바이트를 읽어오..

[Pwnable.kr] Unlink

#HeapOverflow #unlink Heap 공부를 본격적으로 다시 해보고자 이 문제로 시작했다. Heap 병합과정을 통해 생기는 리얼 Unlink 취약점은 아니고, 구조체를 직접 구현해놓고 Unlink 가 이루어지는 과정을 함수로 구현해놓았다. 보급형 Unlink 취약점 ? 이라고 할 수 있을 듯하다. 우선 청크 구조체는 이렇게 생겼다. fd, bk, 버퍼 요소가 들어있다. 크기는 16바이트 씩이다. main 함수에서 사용되는 것은 A, B, C 요소이다. 그 후, 바로 아래 코드와 같이 A, B, C 를 이중연결리스트 로 만든다. 그리고 남은 main 함수 로직은 이러하다 A 가 들어있는 스택주소 leak 시켜줌 A 의 주소 leak 시켜줌 gets 함수로 A 의 buf 에 무제한으로 쓴다. un..

[Pwnable.xyz] note

note #got_overwrite #BOF 바로 들어가보자. 파일은 일반 ELF 파일이다. 별다른 점은 없다. main 함수를 보면 메뉴번호를 고를 때 read_int32 함수를 통해 번호를 전달받는다. 이는 얼마안가서 취약점을 촉발시키는 매개가 되는데, read_int32 함수를 알아보자. 이 함수를 보자마자 눈여겨봐야겠다고 느낀게 문자열 형태의 숫자 를 atoi로 정수 로 바꿔주고 있었기에 얼마나 큰 수를 입력해도 검증과정없이 정수로 바꿔주는 과정이 조금 이상해보였다. 뭐 결론적으론... 좋은 발견이었지만. 그리고 1번 메뉴를 선택하면 edit_note 함수로 들어오는데 모습은 이렇다. 이 부분에서 read_int32 함수의 좋은 기능을 활용할 수 있는데, 일단 s 는 전역배열로 선언되어있는 32바..

[Pwnable.xyz] Game

Game #Pwanble.xyz #Game 오래간만에 포너블 문제를 풀어보았다. 문제 소개로는 감이 안온다. 바이너리를 까보자. 그냥 수학문제 푸는 것 같아보인다. 분석을 해보자. 핵심만 분석해보자면, init_game() 함수에서 현재 문제풀이 상태와 문제푸는 사람 이름을 적어두고 play_game() 함수를 저장하는 cur구조체 를 초기화 한다. 이름은 최대 16바이트, 문제풀이 점수는 8바이트, play_game() 함수를 저장하는데에 8바이트를 써서 구조체는 총 32바이트이다. [play_game()] main() 함수에서 1번 Play Game을 선택하면 cur구조체 안에 있던 play_game() 함수가 실행된다. 이 함수는 별다른 기능은 없고, urandom 파일에 의해 나온 정수 2개를 랜..

[System32.kr] RSA101

RSA101 #Crypto #RSA Algorithm #Inverse System32.kr 워게임의 메인컨텐츠로 보이는 Crypto 문제의 서막이다. RSA 문제 시리즈가 여러가지가 있는데 그에 대한 첫 단추를 꿸 수 있는 문제로 보인다. 이와 동시에 RSA공부도 시작할 수 있을 것 같다. RSA에 대한 것은 따로 정리하고 문제풀이에 관해서만 핵심적으로 정리하겠다. 우선 문제파일은 paste bin에 올라온 이 텍스트 파일이다. RSA에 필요한 서로소인 수 p,q 와 공개키 e, 그리고 암호화 된 데이터 c가 들어있다. 여기서 개인키 d를 추출해서 복호화 하면 될 것 같다. 참고로 원래 데이터인 M은 이러한 구조로 복호화 가능하다. 문제풀이를 위해 파이썬 Crypto 모듈을 이용했다. 모듈러 연산 시, ..

[ Reversing.kr ] Ransomware

Ransomware #crack me #custom crypto 오랜만에 reversing.kr 을 풀어보았다. 랜섬웨어라고 하는데... key를 알맞게 입력하면 압축파일로 같이 준 file을 올바르게 복호화 해주나보다. (키 값의 옳고 그름에 관계없이 일단 어떤 연산을 거쳐 복호화 해주긴한다.) 일단 처음 바이너리는 UPX로 패킹되어있다는 것을 알 수 있다. upx 언패커로 패킹을 해제하고... IDA에 올려보면 hex ray를 방해하기 위한 용도인지 쓸데없는 쓰레기 코드들이 있다. 그래서인지 main함수가 너무 크다며, 디컴파일이 안된다. 고민을 하다가 idc 함수를 이용해서 다 nop 처리 후, main함수 프롤로그를 옮기기로 하였다. 아래는 패치코드이다. addr=0x4135F4 end_addr=..

반응형