전체 글

· 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이란..
보호되어 있는 글입니다.
· CTF
HSCTF 8의 stonks 문제다. 이 문제는 대회 기간 내에 풀지 못했지만, 좋은 교훈을 얻을 수 있던 문제라서 풀이한다. 문제를 실행하면 다음과 같은 실행 화면이 나온다. 출력된 문구들을 보면 ai 주식 가격 출력 프로그램인 것 같다. 'Please enter the stock ticker symbol: '라는 문구를 통해 사용자의 입력을 받는데, 시험삼아 많은 수의 1을 입력으로 주니 segmentation fault가 터졌다. bof 취약점이 있는 것 같다. ida를 통해 문제의 main 함수를 확인해보면 puts 함수를 통해 문구들을 출력하고 이름부터 취약한 vuln 함수를 실행해 주는 것을 알 수 있다. vuln 함수에서 사용자의 입력을 처리하는데, 문제는 bof 취약점이 있는 gets 함수..
· CTF
HSCTF의 seeded-randomizer 문제다. 자바 파일이 하나 주어져 있다. import java.util.Random; public class SeededRandomizer { public static void display(char[] arr) { for (char x: arr) System.out.print(x); System.out.println(); } public static void sample() { Random rand = new Random(79808677); char[] test = new char[12]; int[] b = {9, 3, 4, -1, 62, 26, -37, 75, 83, 11, 30, 3}; for (int i = 0; i < test.length; i++) ..
· CTF
ThcCTF 2021의 Living QR Code 문제다. gif 파일이 하나 주어져 있다. gif 파일을 열어본다면 위 사진과 같은 QR 코드가 나오는데, 문제는 gif 파일이다 보니 QR 코드 이미지가 바뀌어 가면서 보여진다. 일단 무엇을 하든 gif로 압축된 원본 사진 파일들이 필요할 것 같아서 jpg로 변환했다. (변환에 사용한 사이트다. https://ezgif.com/gif-to-apng) 위는 gif파일을 jpg로 변환한 모습이다. 확인해보니 각각 모양이 다른 QR code 이미지 41개가 존재했다. 처음에는 이 이미지들을 모두 겹쳐서 만들어진 QR code를 스캔해야지 flag를 얻을 수 있지 않을까 생각해 이미지 겹치기 관련해서 구글링을 했었다. 하지만 답은 생각보다 간단했었다. 단순히 ..
· CTF
ThcCTF 2021의 SQL for dummies 문제다. 웹 사이트 주소가 주어져 있는데, 해당 웹 사이트를 통해 flag를 얻는 것 같다. 문제 이름, 설명을 고려했을 때 sql injection을 통한 로그인 우회로 flag를 얻는 것 같다는 생각이 들었다. 주어진 주소에 접속하면 위 사진과 같은 화면이 뜬다. 예상대로 로그인 화면이다. 보통 username, password가 유효(올바른지)한지 검증하는 취약한 sql 쿼리문은 select from where = '' and = '';로 처리된다. 이 문제 역시 위와 같은 쿼리문으로 작성됐다 가정하고 쿼리문의 where(조건)절이 무조건 참이되도록 1' or '1' = '1' --를 입력 값으로 줘 보았다. (처음에는 admin으로 로그인해야지 ..
· CTF
ThcCTF 2021의 Welcome 문제다. 이 문제는 설명에 나와 있는 discord 서버에 들어가기만 해도 flag를 준다.
· Wargame/FTZ
level19로 로그인한 후 hint를 확인해보면 소스코드가 나온다. 전 단계에서 많은 양의 코드를 보여줬기에 19 level은 더 많거나 복잡할 줄 알았지만 예상보다 간단했다. 소스코드도 작고 대놓고 gets 함수가 보여서 bof가 일어남을 알 수 있다. 공격은 gets를 통해 overflow를 일으켜 ret를 쉘 코드가 들어간 환경변수의 주소로 변조하면 될 것 같다. 이번 단계는 setuid가 없기 때문에 setuid가 포함된 쉘 코드를 써야겠다. main의 함수 프롤로그 부분과 gets 함수 부분에 bp를 걸고 실행한다면 ret와 buf의 스택 주소를 알 수 있다. ret : 0xbffff45c buf : 0xbffff430 따라서 ret와 buf 사이의 거리는 44byte인 것을 알 수 있다. r..
· Wargame/FTZ
level18로 로그인하고 힌트를 보면 굉장히 긴 코드가 나온다. 다른 level에 없던 긴 코드에 조금 쫄았으나, 취약점은 굉장히 간단하다. #include #include #include #include void shellout(void); int main() { char string[100]; int check; int x = 0; int count = 0; fd_set fds; printf("Enter your command: "); fflush(stdout); while(1) { if(count >= 100) printf("what are you trying to do?\n"); if(check == 0xdeadbeef) shellout(); else { FD_ZERO(&fds); FD_SET(..
dyp4r
dyp4r's Study Blog