[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] 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..