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

Stack7의 코드를 보면 필터가 걸려있다. 그래서 ROP(ppr)기법을 쓰기로 했다. 우선 환경변수를 설정하고 주소를 알아내자.


환경변수의 주소는 0xbffffdcf 다.

이제 ret 주소를 알아내자.

8048492!

이제 페이로드를 짜자.








'Wargame > Protostar' 카테고리의 다른 글

Protostar Heap1  (0) 2017.12.31
Protostar Heap0  (0) 2017.12.31
Protostar Stack6  (0) 2017.04.05
Protostar Stack5  (0) 2017.04.05
Protostar Stack4  (0) 2017.04.02

사실 Stack6는 Stack5랑 똑같이 RTL을 써서 풀면 아주 쉽게 풀린다. 넘어가고 싶지만 그냥 하기로 했다.

자 RTL을 쓰자 시스템 주소와 /bin/sh의 주소는 저번에 구했던 것과 같을테니 과정은 생략한다.

버퍼 크기를 보면

버퍼의 크기가 76byte라는 걸 알 수 있다.


이제 페이로드를 만들어보면



'Wargame > Protostar' 카테고리의 다른 글

Protostar Heap0  (0) 2017.12.31
Protostar Stack7  (0) 2017.04.06
Protostar Stack5  (0) 2017.04.05
Protostar Stack4  (0) 2017.04.02
Protostar Stack3  (0) 2017.04.01

Stack5 코드를 보면 아~주 간단하게 나온다. 나는 여기에 RTL 기법을 쓰기로 했다.

버퍼의 크기를 구하는 건 저번에 설명했기 때문에 생략한다. 버퍼의 크기는 dummy를 포함해 72byte다.


이제 여기에 RTL 기법을 쓸건데 우선 필요한게 두 가지다.


바로 시스템주소와 /bin/sh의 주소다. 지금부터 구하겠다.


우선 시스템주소다. 

시스템주소는 gdb로 브레이크 포인트를 걸고 실행시킨 다음 p system 명령어를 이용하여 구할 수 있다.

시스템 주소는 0xb7ecffb0이다.

이제 /bin/sh의 주소를 구하면 된다.


/bin/sh는 코드를 구현해서 짰다.

/bin/sh의 주소는 0xb7fb63bf다.


자 이제 페이로드를 짠다.

페이로드는 버퍼+더미+sfp를 포함해 76을 채우고 시스템 주소 그 다음에는 인자값으로 4바이트 마지막으로는

/bin/sh의 주소를 넣어주면 될 것이다.




'Wargame > Protostar' 카테고리의 다른 글

Protostar Stack7  (0) 2017.04.06
Protostar Stack6  (0) 2017.04.05
Protostar Stack4  (0) 2017.04.02
Protostar Stack3  (0) 2017.04.01
Protostar Stack2  (0) 2017.03.29


gets 함수의 취약점을 이용하면 풀 수 있을 것 같다.

gdb로 main 함수를 보니 이렇게 나와있다 main+21에 브레이크 포인트를 걸고 실행시킨 후 버퍼의 시작부분과 sfp의 시작부분을 빼줘서 버퍼의 크기를 구하면?

72라고 보니 더미가 있는듯? 그럼 버퍼(64byte)+더미(8byte)+sfp(4byte)+ret(4byte)로 되어 있는게 아닐까 싶다.

이제 win 함수의 주소를 구하면

시작주소를 쓰자 리틀엔디안이니까 \xf4\x83\x04\x08이 되시겠다.

이제 페이로드를 짜자.


'Wargame > Protostar' 카테고리의 다른 글

Protostar Stack6  (0) 2017.04.05
Protostar Stack5  (0) 2017.04.05
Protostar Stack3  (0) 2017.04.01
Protostar Stack2  (0) 2017.03.29
Protostar Stack1  (0) 2017.03.22

Stack3는 fp에  win함수의 주소값을 넣어서 푸는 문제다.


먼저 win 함수의 주소값을 알아내기 위해여 GDB를 사용했다.

win 함수의 시작주소는 0x08048424이다.

버퍼의 크기를 알아보니 64바이트였다. 그래서 64개의 값을 넣은 다음 win 함수의 주소를 넣는다면 fp에 win 함수의 주소가 들어갈 것이다.


'Wargame > Protostar' 카테고리의 다른 글

Protostar Stack5  (0) 2017.04.05
Protostar Stack4  (0) 2017.04.02
Protostar Stack2  (0) 2017.03.29
Protostar Stack1  (0) 2017.03.22
Protostar Stack0  (0) 2017.03.20

문제의 코드를 보면 getenv라는 함수의 값을 variable에 저장하고 나중에 strcpy 함수를 이용해 buffer에다가 variable 값을 저장한다. 아마 여기서 취약점이 발생할 것 같은데 환경변수에다가 코드를 짜서 나중에 버퍼에 복사되었을 때 버퍼 값이 꽉 채워지고 그 다음에 0x0d0a0d0a도 넣어준다면 BOF가 되어 modified 값에 들어가서 성공할 수 있을 것이다.

그냥 코드를 써 넣는다면 bad variable name 이라고 뜰 것이다. 그래서 나는 문자열로 받게 코드 사이에 ""을 추가했다. 이게 맞겠지? 

성공하면

ㅎㅎ 끝

 

'Wargame > Protostar' 카테고리의 다른 글

Protostar Stack5  (0) 2017.04.05
Protostar Stack4  (0) 2017.04.02
Protostar Stack3  (0) 2017.04.01
Protostar Stack1  (0) 2017.03.22
Protostar Stack0  (0) 2017.03.20