[Pwnable.kr] UAF
2021. 5. 8. 23:00
Wargame/Pwnable.kr
1. 문제 보면 Human 클래스와 Man, Woman 클래스가 상속 관계인 것 같다. 먼저 Human 형 m, w 객체가 초기화된다. 1번 : 각 객체의 introduce() 함수가 실행된다. 2번 : char 형 객체가 생성된다. argv[1] 으로 받은 크기만큼 메모리를 할당해서 data 변수가 가르키도록 한다. 그리고 argv[2] 로 입력받은 파일을 열어서 len byte 만큼 데이터를 읽고 읽은 데이터를 data 에 저장한다. 3번 : m, w 객체가 free 가 된다. -> 본 문제는 uaf 문제로 malloc 으로 할당한 뒤 free 후 재사용하는 방식이다. (uaf : malloc -> free -> malloc) 초기화된 m, w 객체를 3을 입력하여 free 해주고, 다시 2를 입력하..
[Pwnable.kr] 6번 random
2021. 4. 8. 23:54
Wargame/Pwnable.kr
먼저 rand 함수의 결과로 반환된 값을 random 변수에 저장한다. 그리고 scanf를 통해 입력받은 key값과 random 값을 xor 연산을 해 0xdeadbeef와 같은 값이 되면 system 함수가 실행된다. 그러면 어떻게 random 값을 유추해서 우리가 입력한 값과 연산해야할까? 사실 그럴 필요가 없다. rand() 함수의 경우 seed 값에 따라 다른 값들을 생성해낸다. 따라서 seed 값이 같거나 없을 경우 일정한 값을 만들어낸다는 의미가 된다. 참고 : [C언어/C++] rand, srand, time 랜덤함수에 대해서 (난수생성) (tistory.com) [C언어/C++] rand, srand, time 랜덤함수에 대해서 (난수생성) 안녕하세요. BlockDMask 입니다. 오늘은 ..
[Pwnable.kr] 5번 passcode
2021. 4. 8. 19:57
Wargame/Pwnable.kr
우선 ssh로 접속하고 파일들을 확인해주었다. passcode 파일을 실행하니 이름을 입력받고, 입력받은 이름을 출력한 뒤 passcode1를 입력받는다. 그런데 아무 값이나 입력하니 segmentation falut가 발생했다. 그래서 passcode.c 소스 파일을 확인해보았다. main 함수, welcome 함수, login 함수 총 세 부분으로 나누어진다. welcome 함수의 경우 이름을 입력받아서 출력해준다. 이때 버퍼의 크기인 100 byte 만큼만 입력받아 ret를 변경해주진 못할 것으로 보인다. login 함수의 경우, passcode1과 passcode2를 입력받아 passcode들이 특정값과 일치할 경우 flag 파일을 보여준다. 그런데 이때, 한 가지 눈여겨 볼 점이 scanf로 입..
[Pwnable.kr] 4번 flag
2021. 4. 8. 19:50
Wargame/Pwnable.kr
리버싱 문제임을 알 수 있다. text view를 통해 봐도 어셈블리어가 정상적으로 출력되지 않는 것을 알 수 있었다. 일단 프로그램에 포함되어 있는 Strings에 대한 정보를 확인해보자. 따라서 [Quick View(Ctrl + 1)]을 확인하여, [Strings(Shift + F12)]를 열었다. 프로그램이 UPX(Ultimate Packer for eXecutable)를 이용하여 패킹되어 있다는 것을 알 수 있다. UPX는 다양한 파일 포맷을 지원하는 실행 파일 압축 프로그램이다. 실행 파일 압축을 하게 되면, 파일의 크기를 줄일 수 있으며 기본적인 리버싱을 방어할 수 있다. -> 이와 같이 패킹(Packing) 처리가 된 프로그램을 다시 언패킹(Unpacking)하면 원래의 소스코드를 제대로 확..
[Pwnable.kr] 3번 bof
2021. 4. 1. 17:31
Wargame/Pwnable.kr
func() 함수에서 gets 함수를 통해 입력을 받는데, 입력 크기를 지정하지 않아 버퍼의 크기인 32 byte 보다 더 입력을 받아 overflow가 발생하는 모습이다. 오버 플로우를 통해 key 값을 0xcafebabe로 바꿔주면 쉘을 실행할 수 있을 것이다. 그렇다면 offset을 구해보도록하자. func() 함수에서 두번째 call 하는 부분이 gets 함수가 실행되는 부분이다. 이때, overflowme를 인자값으로 주기 때문에 코드 위쪽을 보면 overflowme의 주소를 알 수 있다. ebp - 0x2c로 ebp로부터 44만큼 떨어져 있다. 따라서 offset은 44 + 4(SFP) + 4(RET) = 52이다. 따라서 payload는 다음과 같을 것이다. "A"*52 + "\xbe\xba..
[Pwnable.kr] 2번 collision
2021. 4. 1. 17:06
Wargame/Pwnable.kr
접속을 해서 file들을 확인하니 col, col.c, flag 파일이 있다. hackctf에서 본 적이 있는 유형이다. argv[1]으로 인자를 받아 check_password()의 인자로 넘겨주는데, check_password()의 반환값과 hashcode 값이 동일할 경우 flag 파일을 볼 수 있다. check_password()의 경우 받은 인자를 int형 포인터로 형변환해 for 문을 돌려준다. for 문을 돌리면서 4바이트씩 참조를 해 res에 값을 누적시키고 마지막에 res를 반환한다. 그리고 반환된 res와 hashcode 값(0x21DD09EC)과 동일하면 된다. 그렇기에 hashcode 값을 5로 나눠주고 그 값을 5개 붙이면 될 듯하다. 그런데 hashcode 값이 딱 나누어 떨어지..
[Pwnable.kr] 1번 fd
2021. 4. 1. 14:55
Wargame/Pwnable.kr
우분투에서 ssh로 접속해보겠다. flag 파일을 보려고 했지만, Permission denied가 떴다. 아무래도 root만 볼 수 있을 듯 하다. 그래서 fd.c 소스 파일을 확인해보았다. 우리의 목표인 flag 파일을 보기 위해선 read를 통해 표준 입력으로 LETMEWIN을 입력해주어야 할 것이다. 따라서 fd 값을 0으로 만들기 위해 argv[1]에 해당하는 인자값으로 0x1234를 10진수인 4660으로 넣어준다. 그리고 난 뒤 buf에 LETMEWIN을 입력하면 될 것이다. FD(File Descriptor) 파일디스크립터 목적 POSIX 이름 stdio 스트림 0 표준 입력 STDIN_FILENO stdin 1 표준 출력 STDOUT_FILENO stdout 2 표준 에러 STDEFF_F..