분류 전체보기

이번에 풀이할 문제는 HackCTF의 g++ pwn 문제다. 문제 이름이 g++걸 봐서 c++ 소스 코드를 컴파일해주는 g++ 컴파일러가 생각난다. 문제 파일을 실행해보니 입력을 받고, 입력을 받은 값을 출력해주는 동작을 한다. 혹시하고 입력 값으로 많은 1 값을 줬지만 Segment fault 오류는 터지지 않는 것을 알 수 있다. bof 문제가 아닐 수도 있는 것 같다. 보호기법은 nx만 걸려있는 것을 알 수 있다. ida는 제대로 해석을 못하는 것 같아서 ghidra로 main 함수를 확인해봤다. main 함수는 vuln 함수만 호출한다. vuln 함수를 확인해보면 fgets 함수를 이용해 local_40에 32byte만큼 입력을 받는 것을 알 수 있다. local_40의 크기는 32byte인데, ..
· CTF
Cyberthreatforce CTF의 Bof_1 문제다. 문제 자체가 어렵기 보다는 혼자 어렵게(쉐도우 복싱 미쳤다..ㅋㅋ) 생각해서 풀이 시간이 오래 걸렸다. 공격 시나리오만 제대로 안다면 10분도 안 걸리고 풀 수 있는 문제다. 문제 파일을 실행시킨다면 위와 같이 동작한다. "hello who are you?"라는 문구가 출력되고 입력을 받는데, 입력한 값이 그 다음 줄에 "Hello "와 함께 출력된다. checksec으로 보호기법을 확인해보면 Canary와 NX가 걸려 있는 것을 알 수 있다. 이 때까지만 해도 canary를 우회하는 상상을 했다. canary는 그냥 장식이었다.. ida로 메인 코드를 확인해보면 bof에 취약한 포맷 스트링 %s와 scanf 함수로 입력을 받는 것을 알 수 있다..
-Buffer Overflow의 개념- Buffer Overflow는 말 그대로 메모리 상의 저장공간인 버퍼가 흘러 넘친다는 뜻이다. 사용자의 입력을 받을 때 취약한 함수나 길이 제한을 두지 않아 발생하는 취약점으로, 입력 값보다 입력 값을 저장하는 변수의 크기가 작을 때 오버플로우가 일어난다. 예를들어 500ml를 담을 수 있는 페트병에 1L의 물을 담을 시 물이 넘치게(overflow!) 되는데, buffer overflow도 이와 비슷하다. 메모리 상에서는 입력 값을 저장하는 변수 뿐 아니라, 다른 변수들도(해당 함수에서 쓰이는) 저장돼 있고 sfp(stack frame pointer)와 복귀 주소인 ret도 존재하기 때문에, 500byte를 저장할 수 있는 변수에 1000byte의 입력 값을 저장..
이번에 풀이할 문제는 HackCTF의 RTL_World 문제다. 요즘 HackCTF 문제를 잘 안풀고 있었는데, 갑자기 HackCTF 포너블 문제를 올클해보자는 욕구가 생겨 풀이하게 됐다. 일단 문제 명만 봤을 때는 rtl 공격 기법이 쓰일 것 같다. 문제 파일을 실행해본다면 다음과 같은 문구가 출력된다. 신박해보인다. 저기 나온 선택지를 다 선택해봤지만 딱히 얻을 수 있는 정보는 없었다. 다만 3, 4번은 어느정도의 자본(gold)이 필요하다는 것을 알게됐고, 이 파일의 목적은 binary boss를 죽이는, 즉 exploit하는 것임을 알 수 있었다.(1번 선택지를 선택하면 문제 파일의 보호기법이 출력된다.) 일단 ghidra로 열어봐야겠다. undefined4 main(void) { int iVar..
· Wargame/LOB
cobolt로 로그인하면 goblin 문제를 볼 수 있다. goblin 문제를 실행해본다면 입력을 받은 뒤, 입력을 받은 값을 똑같이 출력해준다. 소스코드를 확인해보면 bof에 취약한 대표적인 함수인 gets 함수로 입력을 받는다. 이 gets 함수는 입력 값의 길이에 제한을 두지 않기 때문에, 입력 값이 저장되는 buffer 변수의 크기인 16byte 이상 입력을 한다면 overflow가 발생한다. 딱봐도 쉘 코드를 buffer에 삽입하기에는 공간이 부족하기 때문에 환경변수를 이용해야 될 것 같다고 생각했다. 일단 buffer가 16byte 크기고 다른 변수들은 존재하지 않기 때문에 굳이 gdb로 열어볼 필요 없이 blind 상태로도 exploit이 가능할 것 같았다. buffer의 크기가 16byte..
· Wargame/LOB
gate 문제를 풀 때 wsl telnet을 이용해 접속했다가 쉘이 얻어지지 않는 문제가 생겨, 이번에는 putty로 접속했다. 문제 파일 cobolt와 소스코드 cobolt.c가 주어져 있다. 문제 파일을 실행해보니 인자를 받는 것을 알 수 있었다. 많은 '1'을 인자로 주니 Segmentation fault가 터진 것을 보아 bof 취약점이 있을 가능성이 높다. 소스코드를 확인해보면 인자 값을 strcpy 함수로 16byte 크기의 buffer에 복사해주는데, gate 때와 마찬가지로 길이를 검증하는 로직이나 함수를 사용하지 않는다. 따라서 인자 값으로 16byte보다 긴 값을 준다면 overflow가 발생한다. gate와 마찬가지로 buf에 쉘 코드를 삽입한 뒤 ret를 buf의 주소로 조작해 쉘을..
· CTF
HackASet CTF의 iq 문제다. 이번 ctf는 해킹 대회가 아니라 수학? 우주 과학? 문제 대회 느낌이 났다. (이래서 it를 하려면 수학, 과학 공부를 해야 하는 건가..) 일단 풀이 전 이 ctf는 문제 서버에 접속했을 때 각각의 팀에 부여되는 ticket을 입력해줘야 한다. ticket을 입력해야지 문제 내용이 나온다. nc로 대회 서버에 접속하면 다음과 같은 문구들이 출력된다. QPSK Modulation이라는 문구와 함께 IQ(?) 좌표가 출력되고 0100011 같은 2진 숫자 들을 I/Q Sample로 변환하라고 하면서 입력을 받는다. 아예 감이 안 잡혀서 구글링을 하니 QPSK는 위상 편이 변조다라는 것을 깨달았고 I/Q Sample은 하나의 좌표 체계라는 것을 깨달았다. 약 30분 ..
· Wargame/LOB
wsl ubuntu에서 telnet을 이용해서 접속해봤다. 1단계 id와 pw는 gate/gate다. ls 명령어로 무슨 파일이 있는지 확인해봤다. gremlin, gremlin.c라는 문제 파일과 그 소스코드가 존재하는 것을 알 수 있다. gremlincp 파일은 풀이 과정에서 디버깅을 위해 gremlin 파일을 복사한 것이다. 권한을 확인해보면 gremlin 파일에는 gremlin 계정으로 setuid가 걸려있다. 이 문제 파일을 공격한다면 gremlin 권한으로 된 쉘을 얻을 수 있을 것이다. int main(int argc, char *argv[]) { char buffer[256]; if(argc < 2){ printf("argv error\n"); exit(0); } strcpy(buffer,..
· Wargame/LOB
LOB를 할 때 정상적으로 exploit이 될 만한 코드도 안되는 경우가 있는데, 그 이유는 lob의 bash 버전이 낮기 때문에 \xff를 \x00으로 처리하기 때문이다. 이 말인 즉슨 ret를 \xff가 들어가는 주소로 변조한다 가정하면, 이 \xff는 \x00으로 인식되기 때문에 \xff가 입력되는 순간 더 이상의 입력을 받지 않게 된다. 따라서 정상적인 공격이 힘들어지는 것이다. 해결 방법은 간단하다. root/hackerschoolbof로 로그인한 후 vi /etc/passwd를 입력해 vi 에디터로 진입하고 :를 입력 후 %s/bash/bash2/를 입력해준다면 bash 버전이 2로 바뀌게 되면서 원활한 문제 풀이가 가능해진다. -login- id : root pw : hackerschoolb..
계기 지금까지 ftz, lob 등 shellcode가 필요한 wargame을 풀 때면 구글링을(ex : 32bit shellcode 검색) 통해 얻은 shellcode로 풀이를 진행했었다. 그런 식으로 풀이를 하다가 갑자기 오늘 이런 생각이 들었다. "굳이 인터넷에서 남이 만든 쉘 코드를 가져올 필요 없이 내가 직접 원하는 기능을 하는 쉘 코드를 만들면 되지 않을까?" 쉘 코드를 만든다면 어셈블리어에 대한 이해도가 높아질 것이며, 또한 구글링을 통해 얻는 쉘 코드는 기능적 제약 사항이 있으므로 공부 삼아 직접 만들어보기로 했다. System Call 쉘 코드를 만들기 전 알아야하는 지식으로 system call이 있다. srop 공격을 공부해봤다면 쉽게 알 수 있는 내용인데, 이 system call이란..
dyp4r
'분류 전체보기' 카테고리의 글 목록 (4 Page)