Protostar Heap3
코드를 보자
32만 할당하니까 우선 fastbin이라는 것을 알 수 있다. fast는 다른 bin 과 free될 때 다른 bin들과 다르다.
그리고 strcpy를 이용하여 fd와 bk를 마음대로 조작할 수 있다.
fake chunk 생성이 가능하다는 것이다. 첫번 째 청크를 조작하여 2번 째 청크의 prev_size와 size fd bk를 조작하여
b청크가 free 될 때 unlink가 되게하여 printf(실제로는 puts함수가 쓰인다.)에 winner의 주소가 들어가게 할 것이다.
처음에 문제 풀 때 내 우분투 환경에서 풀려고 했으나 이상하게 안되서 시간을 엄청 낭비하고 결국 포기하고 protostar iso를 다운받아서 풀었다...
쉘코드식으로 넣어줘야 풀리기 때문에 push하고 ret를 찾아서 winner함수에 붙였다.
Unlink 가 될 때 현재 청크의 fd+12에 bk 주소를 넣기 때문에 puts_got - 12를 해줘야 한다.
그래서 나중에 unlink가 될 때 puts_got - 12 + 12 == puts_got가 돼서 puts_got에 winner가 들어갈 수 있는 것이다.
이렇게 넣어주면
성공하게 된다. 아까운 내 시간....깝치지 말고 걍 할걸..
'Wargame > Protostar' 카테고리의 다른 글
Protostar Heap2 (0) | 2018.01.01 |
---|---|
Protostar Heap1 (0) | 2017.12.31 |
Protostar Heap0 (0) | 2017.12.31 |
Protostar Stack7 (0) | 2017.04.06 |
Protostar Stack6 (0) | 2017.04.05 |
Protostar Heap2
문제 코드를 보자
if 문이 엄청 많지만 auth->auth 과 strdup 부분을 보면 될 것 같다.
auth 구조체에 auth 값이 0이 아니여야 성공인 것 같다.
gdb로 보면 service 를 사용하면 auth 부분을 덮을 수 있다는 걸 알 수 있다.
service 로 값을 많이 넣어주면 로그인이 됐다고 뜬다.
이렇게 쉽게 말했지만 C 코드를 보고 엄청 이해가 안가서 힘들었다.
그래서 풀이를 봤더니 gdb로 주소의 위치 차이를 보고 문제를 푸는 걸 보고
gdb의 대단함을 한번 더 깨달았다. gdb를 생활화해야 되는데;;
'Wargame > Protostar' 카테고리의 다른 글
Protostar Heap3 (0) | 2018.01.02 |
---|---|
Protostar Heap1 (0) | 2017.12.31 |
Protostar Heap0 (0) | 2017.12.31 |
Protostar Stack7 (0) | 2017.04.06 |
Protostar Stack6 (0) | 2017.04.05 |
Protostar Heap1
먼저 문제 코드를 보면
구조체를 보면 priority와 name 이라는 변수들을 선언한다.
그리고 priority 에 1과 2라는 값을 넣어주고 포인터 변수인 name 을 이용하여 할당을 해준다.
그리고 strcpy로 name에 할당한 곳에 입력한 값을 복사한다.
11은 사이즈 1과 2는 priority 변수에 넣어준 값 1,2 그리고 그 옆에는 name으로 malloc한 주소다.
그리고 aaaa(0x41414141) bbbb(0x42424242) 는 내가 넣은 값이다. 그런데 보면 0x41414141(AAAA) 부분을 보면 overwrite 해서
0x0804b038 를 overwrite해서 다른 주소로 조작할 수 있을 것 같다. 나는 GOT overwrite를 할 것이다.
puts 함수의 got를 알아와서 그 인자로 winner 함수의 주소를 넣어서 공격할 생각이다.
puts_got 와 winner의 주소를 알아냈다.
성공!
'Wargame > Protostar' 카테고리의 다른 글
Protostar Heap3 (0) | 2018.01.02 |
---|---|
Protostar Heap2 (0) | 2018.01.01 |
Protostar Heap0 (0) | 2017.12.31 |
Protostar Stack7 (0) | 2017.04.06 |
Protostar Stack6 (0) | 2017.04.05 |
Protostar Heap0
SECCON Tinypad를 풀면서 내가 Heap에 대한 기본적인 지식이 많이 부족한 것 같음을 많이 느끼고 반성했다. 그래서 Protostar부터 how2heap, 다른 CTF 문제들을 풀어나가면서 Heap을 다시 차근히 공부할 생각이다.
우선 C 코드를 보자.
data 라는 구조체에 name이라는 64byte 짜리 버퍼를 생성한다. 그리고 fp 라는 구조체에는 함수 포인터를 만든다.
여기서부터 약간 냄새가 난다 ㅋㅋㅋ
그리고 malloc를 이용해여 이 구조체 포인터들을 이용하여 구조체들을 할당해주고 함수 포인터가 있는 구조체를 이용하여
nowinner을 가리킨다. 그리고 출력문 다음에 strcpy를 이용하여 버퍼가 있는 구조체에 입력받은 값을 복사한다.
그리고 함수포인터에 있는 함수를 실행시키는데 힙 오버플로우를 하여 함수 포인터를 조작해 nowinner 함수를 winner 함수로 조작시키는 문제일 것이다.
a(61)를 넣고 strcpy 까지 진행시켰을 때의 힙 상황이다. 0x400607 이 nowinner함수 주소인 걸 확인할 수 있다.
a를 80개 넣으면 함수포인터를 조작할 수 있을 것 같다. name[64] + 16(dummy) 여서 80개를 넣어야 하는 것 같다.(32bit 컴파일이 아니라 64bit 컴파일 환경이다.)
winner 함수의 주소는 0x4005f6 이다 a를 80개 넣고 리틀엔디안 방식으로 winner 의 주소를 넣어주면 level pessed 가 뜰 것이다.
예상대로 성공했다!
'Wargame > Protostar' 카테고리의 다른 글
Protostar Heap2 (0) | 2018.01.01 |
---|---|
Protostar Heap1 (0) | 2017.12.31 |
Protostar Stack7 (0) | 2017.04.06 |
Protostar Stack6 (0) | 2017.04.05 |
Protostar Stack5 (0) | 2017.04.05 |
LOB 6번 wolfman
#LOB 문제를 풀 때는 bash2 명령어를 꼭 입력해야한다. LOB는 더미가 없다.
코드를 보면
argv[1]의 길이를 확인하는 필터가 추가되었다.
하지만 나는 argv[1]을 초과하는 일이 없으니 똑같이 풀면 된다.
strcpy하는 부분에 브레이크 포인트를 걸고 실행하여 argv[2]의 주소를 얻고 페이로드를 작성하여 실행하면 쉘이 따진다.
만약 실패했다면 생성된 core 파일을 gdb로 열어 argv[2]의 주소를 재설정해주면 된다.
끗
'Wargame > Load Of Buffer overflow' 카테고리의 다른 글
LOB 5번 orc (0) | 2017.05.10 |
---|---|
LOB 4번 goblin (0) | 2017.05.07 |
LOB 3번 cobolt (0) | 2017.05.02 |
LOB 2번 gremlin (0) | 2017.05.02 |
LOB 1번 gate (0) | 2017.05.02 |