p4c

· CTF
이번에 참여한 TamuCTF 2021은 PlaidCTF에 비해 난이도가 낮아서 풀기 수월했던 것 같다. 3문제를 풀긴 했지만 비교적 난이도도 낮고 솔버도 많은 문제들이라 다음에는 솔버 수가 적은 문제들도 풀 수 있도록 노력해야겠다는 생각이 든다. 처음에는 문제 서버가 특이해 삽질도 많이 했지만 공지 사항에 이미 적혀있던 것을 보고 대회 시작전 공지 사항을 정독해야겠다는 것을 깨달았다. 안 풀리면 write up을 볼 수 있는 wargame과는 달리 CTF는 대회 진행중에는 write up, 해답을 알 수 없으니 계속해서 풀어볼 수 밖에 없는데, 분석 끝에 exploit을 성공해 flag를 얻었을 때의 기분은 wargame을 풀었을 때의 기분과는 차원이 달랐다. 이번에는 pwn 문제만 집중적으로 풀었지만 ..
· CTF
이번에 풀이할 문제는 TamuCTF의 TicTacToe 문제다. 문제 문구를 보니 tic tac toe 게임에서 이기면 flag를 주겠다는 것 같다. 이 문제 역시 tictactoe 파일 하나만 주어진다. 다른 문제들과 마찬가지로 실행을 시켜보려했지만 실행이 안된다는 문구가 나왔다. 이상하게 여겨져 hxd로 16진수 값들을 확인해보니 elf 파일이 아닌 python 코드 파일이라는 것을 알 수 있었다. #!/usr/bin/python from itertools import product from random import randint import sys from hashlib import sha256 import pickle import base64 def check_winner(board): posit..
· CTF
이번에 풀이할 문제는 TamuCTF의 Pancake 문제다. 문제 파일은 pancake만 주어져 있다. 문제를 실행해보면 위와 같은 결과가 나온다. 지금껏 풀었던 wargame을 기반으로 추측해보자면 stack overflow를 통한 변수 값이나 ret 변조, 쉘코드 삽입이 아닐까 생각이든다. checksec 명령어로 보호기법을 확인해보니 NX만 걸려있는 것을 볼 수 있다. canary는 존재하지 않는 것을 봐서 stack overflow를 통한 ret, 변수 값 변조가 맞는 것 같다. ida를 통해 main 코드를 확인해보니 fgets로 80byte만큼 입력 값을 받아 char형 배열 s에 저장하는데, 이 후 int형 변수 v13의 값이 138438280이라면 flag를 읽어준다. stack overf..
· CTF
이번에 풀이할 문제는 TamuCTF의 Handshake 문제다. 솔직히 이 문제를 처음 봤을 때 TCP의 handshake가 생각이 나서 네트워크, 소켓 관련이 아닐까하고 좀 쫄았었다. pancake 문제와 마찬가지로 handshake 파일 하나만 주어져 있었다. 문제 파일을 실행해보면 secret handshake가 뭔지 물어보고 입력을 받는다. 그 다음 입력 값이 맞지 않다면 "입력 값이 맞지 않아, 너는 여기오면 안돼"라는 문구를 출력한다. checksec 명령어로 보호기법을 확인해보니 NX bit만 걸려 있었다. 이 문제 역시 stack overflow 취약점일 가능성이 있는 것 같다. ida로 main 함수를 확인해보니 vuln 함수를 호출하고 lose 함수를 호출하는 것을 볼 수 있다. 왠지 ..
· CTF
PlaidCTF는 2021 4월 17일 ~ 4월 19일에 진행된 CTF 대회다. 처음부터 너무 어려운 CTF 대회를 골랐는지 문제를 하나도 풀지 못해 접근한 방식만 작성하려고 한다. 위가 Plaidflix 문제다. 해석해보면 "Plaid+ episodes가 재미없다고? 바뀐 Plaidflix를 시도해봐라"다. 이번 CTF는 특이하게 문제(테마?) 하나당 여러 에피소드(문제)로 구성돼 있는데 나는 Launch를 풀려고 시도했다. 문제를 받아서 확인해보면 위 사진과 같이 flag.txt 파일, plaidflix 파일이 존재한다. 이 외로도 도커 파일이 있지만 문제 풀이와는 연관 없는거 같아 스킵했다. 당연히 flag.txt에 적혀있는 것은 진짜 flag가 아닌 가짜 flag였다. 여기까지 봤을 때 예상할 수..
Unit 58 자료형 변환하기 -자료형 변환- 자료형을 지정하여 변환하는 것을 명시적 자료형 변환이라고 한다. 이 명시적 자료형 변환을 하는 방법은 변수나 값 앞에 (자료형)을 붙여주면 된다. (자료형) (자료형) #include int main() { float a = 1.23; // float형 변수 선언 int b = (int)a; // a의 형을 int로 바꾼 후 int형 변수 b에 저장 printf("%d", b); // b 출력 } 위 코드는 명시적 자료형 변환을 이용해 float형 변수 a의 값을 b에 저장한 코드다. int형으로 변환된 값 1이 출력되는 것을 볼 수 있다. 예전에는 명시적 자료형 변환 없이 int b = a; 형식으로 써줘도 작동은 했지만 컴파일 경고가 발생했었다. 하지만 ..
Unit 56 구조체 필드 사용하기 지금까지는 여러 자료형을 사용하여 해당 자료형의 크기만큼만 구조체에서 공간을 차지하도록 했는데, 비트 필드를 사용하면 bit 단위로도 값을 저장할 수 있다. 사용은 간단하다. struct { : ; }; 로 멤버를 선언하면 해당 비트만큼의 크기를 가진 멤버가 생성된다. #include typedef struct a { unsigned int a : 1; // 1bit unsigned int b : 2; // 2bit unsigned int c : 4; // 4bit } A; int main() { A a1; a1.a = 1; // a에 1 저장 0000 0001 a1.b = 4; // b에 4 저장 0000 0100 a1.c = 15; // c에 15 저장 0000 1..
이번에 풀이할 문제는 pwnable.kr의 random 문제다. 문제 문구는 "아빠가 프로그래밍에서 랜덤 값을 어떻게 사용하는지 가르쳐 주셨다"다. 접속하니 flag, random, random.c가 주어져 있어서 먼저 cat random.c 명령어로 소스 코드를 확인해봤다. #include int main(){ unsigned int random; random = rand(); // 랜덤 값(?) 생성 unsigned int key=0; scanf("%d", &key); // key 입력 if( (key ^ random) == 0xdeadbeef ){ // key xor random한 값이 0xdeadbeef와 같다면 flag 획득 printf("Good!\n"); system("/bin/cat fla..
dyp4r
'p4c' 태그의 글 목록