HanJeouk의 개인공부 블로그

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

확인

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

확인

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

확인

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

확인

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

확인

코드를 보자


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

문제 코드를 보자

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

Wargame/Protostar2017. 12. 31. 23:23

먼저 문제 코드를 보면

구조체를 보면 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

Wargame/Protostar2017. 12. 31. 21:09

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 문제를 풀 때는 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