'Wargame'에 해당되는 글 454건

FTZ level16

Wargame/FTZ 2018. 1. 6. 21:13

소스를 보면 함수 포인터에 printf함수의 주소가 들어가있는걸 볼 수 있다. 간단하게 shell함수의 주소로 함수 포인터 변수인 call변수의 메모리 영역을 덮어주면 된다.

 

먼저 gdb로 printit의 함수주소와 shell의 함수주소를 구했다.

 

 

 

그 다음 스택구조를 확인해보니 총 40바이트(buf 20byte + dummy 20byte) 후에 printit함수의 주소가 담겨있는걸 확인할 수 있었다.

 

필요한건 다 구했으니 이제 printit함수의 주소가 담겨있는 영역에 shell 함수의 메모리주소값을 덮어씌워주면 된다.

 

 

 

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

FTZ level18  (0) 2018.01.07
FTZ level17  (0) 2018.01.07
FTZ level15  (0) 2018.01.06
FTZ level14  (0) 2018.01.06
FTZ level13  (0) 2018.01.06
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

FTZ level15

Wargame/FTZ 2018. 1. 6. 20:29

소스를 보면 다음과 같다. 이전단계와 로직자체는 같은데 차이점은 포인터형 변수라 비교하는 변수의 메모리영역 값이 아닌, 비교하는 변수의 메모리 영역의 있는 값이 주소인 곳의 값을 비교한다.

 

 

먼저 스택 구조를 파악해야하는데 이전단계처럼 단순히 check변수 영역에 비교값을 넣기만 하면 되는게 아니라 brute forcing 식으로 더미노드값을 늘려가면서 할 수가 없어 해당 소스를 긁어다 위의 소스코드 구조일 때 지역변수간의 더미노드를 포함한 정확한 거리를 출력해주는 소스를 짰다.

 

 

랜덤스택이라 스택값 자체는 변하지만 구조자체는 변하지 않기 때문에 각 변수간의 거리차를 통해 더미노드를 포함한 스택구조를 구할 수 있었다.

 

 

buf 시작주소와 check 시작주소사이의 거리차이는 40바이트다.

 

그럼 이제 메모리 특정영역에 비교하는 대상값인 0xdeadbeef를 넣어놓고 check변수의 스택영역값을 미리 올려놓은 0xdeadbeef가 들어있는 메모리주소값으로 덮어주면 된다.

 

현재 스택이 랜덤스택이기때문에 버퍼부분에다 올려놓고 가르킬 수가 없었고 환경변수는 주소값이 변하지 않아 환경변수를 사용했다.

 

 

 

 

이제 필요한건 다 구했으니 바로 익스해주면 된다.

 

 

잘나온당.

 

 

 

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

FTZ level17  (0) 2018.01.07
FTZ level16  (0) 2018.01.06
FTZ level14  (0) 2018.01.06
FTZ level13  (0) 2018.01.06
FTZ level12  (0) 2018.01.05
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

FTZ level14

Wargame/FTZ 2018. 1. 6. 12:07

소스를 보면 그냥 스택 내의 특정 변수 영역을 원하는 값으로 덮어쓰면 된다. 스택 구조를 알고있냐고 간단히 물어보는 것 같다.

 

 

대충보면 buf 20byte 이후에 check변수의 4바이트 영역이 존재할텐데 이 사이에는 몇바이트의 더미노드가 존재할지 모른다. 즉 더미노드값을 0바이트부터 1바이트씩 늘려가면서서 20byte+dummy+덮을check값 요렇게 넣어주면 된다. 40byte+check값 요렇게 터졌고 더미노드가 20byte였던 것을 알 수 있었다.

 

 

 

 

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

FTZ level16  (0) 2018.01.06
FTZ level15  (0) 2018.01.06
FTZ level13  (0) 2018.01.06
FTZ level12  (0) 2018.01.05
FTZ level11  (0) 2018.01.05
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

FTZ level13

Wargame/FTZ 2018. 1. 6. 11:22

소스를 보면 이전과 익스자체는 크게 다른게 없어 RTL로 풀어주면되는데 중간에 스택가드가 들어가있다. 스택가드 영역을 기존과 같이 0x1234567로 덮어주면서 익스해주면 된다.

 

 

먼저 스택가드영역 확인해보면 다음과 같이 1024입력값을줬을때 12바이트 더미 후에 0x01234567이 들어있으므로 buf 1024 + dummy 12 + stack guard 4 + dummy ?? + sfp + ret 인 것을 알 수 있다.

 

 

이제 스택가드 영역 후의 더미값 확인 후 RET 영역 확인해서 이전과 같이 RTL방식으로 진행하면 된다. 스택가드 이후 12바이트값이 들어갔을 때 세그먼트 fault가 터지는 것으로 보아 8바이트 더미 + sfp + ret 인 것을 알 수 있다.

 

 

이제 메모리 구조 파악이 다 됬으니 이전과 같이 익스만 해주면 된다.

./attackme `python -c 'print "A"*1036+"\x67\x45\x23\x01"+"A"*12+"\xc0\xf2\x03\x42"+"A"*4+"\xa4\x7e\x12\x42"'`

 

 

 

 

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

FTZ level15  (0) 2018.01.06
FTZ level14  (0) 2018.01.06
FTZ level12  (0) 2018.01.05
FTZ level11  (0) 2018.01.05
FTZ level10  (0) 2018.01.05
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

FTZ level12

Wargame/FTZ 2018. 1. 5. 22:35

입력값 부분만 다를뿐 level11과 똑같은 방식으로 풀이가 가능해 RTL로 풀었당.

 

 

 

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

FTZ level14  (0) 2018.01.06
FTZ level13  (0) 2018.01.06
FTZ level11  (0) 2018.01.05
FTZ level10  (0) 2018.01.05
FTZ level9  (0) 2018.01.05
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

FTZ level11

Wargame/FTZ 2018. 1. 5. 22:01

힌트파일을 보면 다음과 같다.

 

 

처음엔 별다른 제약이 없어 그냥 BOF를 시도했지만 스택주소값이 랜덤하게 바뀌는바람에 RTL로 시도했다.

 

먼저 스택구조를 확인해보면 다음과 같이 268바이트에서 세그먼트 fault가 뜨는걸로 보아 더미노드8바이트가 포함되어있다.

 

 

SFP까지 268바이트 덮고 RET값에 시스템 함수 주소 넣어준다음 인자값 넣어주기 위해 더미값4바이트 추가한 후 /bin/sh 문자열주소값을 찾아서 넣어주면 될 것 같다.

 

먼저 system함수의 값을 구하기 위해 간단한 system함수를 호출하는 코드를 짜서 동적으로 컴파일 한 후 main함수에 bf걸고 실행을 시켜 동적라이브러리를 로딩시킨다음 print system 함수로 주소값을 구했다.

 

 

 

다음으로 system 함수의 인자로 들어갈 /bin/sh 문자열 주소값을 구해야 되는데 처음엔 환경변수에 넣고 주소값 구한다음에 시도해봤는데 랜덤스택때문인지 제대로 동작을 안했다.

 

그래서 system 함수의 시작 주소부터 1바이트씩 증가하면서 /bin/sh를 찾는 코드를 짜서 돌렸다.

 

 

 

이제 준비물을 다 구해졌으니 그대로 익스플로잇 해주면 된다.

./attackme `python -c 'print "A"*268+"\xc0\xf2\x03\x42"+"A"*4+"\xa4\x7e\x12\x42"'`

 

 


 

 

 

 

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

FTZ level13  (0) 2018.01.06
FTZ level12  (0) 2018.01.05
FTZ level10  (0) 2018.01.05
FTZ level9  (0) 2018.01.05
FTZ level8  (0) 2018.01.05
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

FTZ level10

Wargame/FTZ 2018. 1. 5. 14:34

hint를 보면 다음과 같이 공유메모리 내용을 읽어오라고 한다.

 

간단한 공유메모리 내용을 읽는 c소스 예제를 찾아서 그대로 붙여넣은다음 키값만 바꿔서 실행시켜줬다.

 

 

 

 

 

 

 

 

 

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

FTZ level12  (0) 2018.01.05
FTZ level11  (0) 2018.01.05
FTZ level9  (0) 2018.01.05
FTZ level8  (0) 2018.01.05
FTZ level7  (0) 2018.01.05
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

FTZ level9

Wargame/FTZ 2018. 1. 5. 13:57

힌트를 보면 다음과 같다. buf에 들어가는 입력값으로 bof를 발생시켜서 buf2의 처음부분을 go로 덮으면된다.

 

 

버퍼 크기가 일단 10이기 때문에 더미노드 생각해서 10바이트부터 1바이트씩 늘려가면서 시도해주면 16바이트입력후 go를 넣었을때 인증이되고 더미노드가 6바이트였던것을 알 수있다.

 

 

 

 

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

FTZ level11  (0) 2018.01.05
FTZ level10  (0) 2018.01.05
FTZ level8  (0) 2018.01.05
FTZ level7  (0) 2018.01.05
FTZ level6  (0) 2018.01.05
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

FTZ level8

Wargame/FTZ 2018. 1. 5. 13:11

힌트를 보면 다음과 같이 파일사이즈가 나오고 해당파일사이즈의 파일을 검색하면 다음과 같이 found.txt라는 파일이 나온다.

 

 

파일 내용을 확인해보면 다음과 같이 shadow 파일과 같은 내용들이 포함되어 있다. 다 같은 값들이니 john the ripper로 아무거나 돌려봤다.

 

 

 

잘나온당.

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

FTZ level10  (0) 2018.01.05
FTZ level9  (0) 2018.01.05
FTZ level7  (0) 2018.01.05
FTZ level6  (0) 2018.01.05
FTZ level5  (0) 2018.01.05
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

FTZ level7

Wargame/FTZ 2018. 1. 5. 12:49

힌트를 보면 다음과 같이 나온다.

 

 

패스워드를 맞추면 되는거 같은데 /bin/level7 파일을 실행해보면 wrong.txt파일이 없다고한다. 한참 뭐지하면서 삽질하다가 뭔가 이상해서 검색해보니 원래 wrong.txt파일내에 패스워드와 관련된 값이 쓰여있고 이를 출력해준다고 한다.

 

그래서 원래 내용을 찾아보니 다음과같이 출력된다고 한다.

 

올바르지 않은 패스워드 입니다.

패스워드는 가까운곳에...

--_--_- --____- ---_-__ --__-_-

 

요건데 2진수를 10진수로 바꾸라고한걸로보아 - _ 이 1과 0을 의미하는거 같다. 경우는 -가 1 _가 0이거나 반대인 경우인데 -를 1 _가 0이라고 생각하고 이진수를 만들어봤다.

 

 

 

요런식으로 이진수를 16진수로 변환한뒤 ascii값 찾아봤더니 위의 값이 나왔다.

 

패스워드에 쳐보니 정상적으로 인증이 됬다.

 

 

 

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

FTZ level9  (0) 2018.01.05
FTZ level8  (0) 2018.01.05
FTZ level6  (0) 2018.01.05
FTZ level5  (0) 2018.01.05
FTZ level4  (0) 2018.01.04
블로그 이미지

JeonYoungSin

메모 기록용 공간

,