힌트가 매우 길다.


디버깅해서 메모리구조랑 변수를 확인해보자



0x100만큼이므로 256바이트이다.


메모리구조를 확인하면


가 되겠고

낮은->높은주소 순으로 fds count x check string[100] 이 되겠다.

그리고 힌트로 주어진 소스코드의 동작 방식을 보면 0x08값을 전달해야 string[count] 배열의 인덱스를 1바이트 감소시킬 수 있기 때문에

여기서는 16진수 0x08을 입력해야한다.

근데 read()함수, gets()함수와 같이 인자값이 키보드 입력값으로 받는경우에는 16진수값을 파이프를 통해 전달해야한다.


즉 attackme를 실행하고 \x08을 입력하게 되면 4개의 문자가 따로 전달된다는 뜻이다.


그러면 공격코드를 작성하면


(python -c 'print "\x08\x08\x08\x08"+"\xef\xbe\xad\xde"'; cat) |  /home/level18/attackme



통과가 된걸 확인

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

FTZ Level20 풀이(미해결)  (0) 2016.07.17
FTZ Level19 풀이(미해결)  (0) 2016.07.17
FTZ Level17 풀이(해결)  (0) 2016.07.17
FTZ Level16 풀이  (0) 2016.07.17
FTZ Level15 풀이(해결)  (0) 2016.07.16


앞전과 비슷하다. 


하지만 쉘을 실행시키는 부분이 없다!


그래서 빠르게 GDB디버깅을 해보았더니 메모리구조는 이전과 동일하게 나타났다.

buf : 20

더미 : 20

*call : 4

crap : 4

더미 : 8

SFP : 4

RET : 4


그렇다면 buf주소를 찾고 buf에 쉘코드를 넣고, RET에는 그 buf의 주소를 넣어주면 해결 될 문제이다.


buf주소를 찾기위해 디버깅을 하자.



자 이제 0xbffff15c부터가 RET가 될것이다.


그럼 공격코드를 작성하겠다.


(python -c 'print "\x90"*15+"\x31\xc0\x31\xd2\xb0\x0b\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\xcd\x80"+"\x20\xf2\xff\xbf"'; cat) | ./attackme


(세그멘테이지 오류발생, 트러블 슈팅중.. OTL) 

-------------------------------------------

추가


마찬가지로 환경변수 사용

환경변수 사용하는것은 Level13 참고(http://manpd.tistory.com/81)



클리어

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

FTZ Level19 풀이(미해결)  (0) 2016.07.17
FTZ Level18 풀이  (0) 2016.07.17
FTZ Level16 풀이  (0) 2016.07.17
FTZ Level15 풀이(해결)  (0) 2016.07.16
FTZ Level14 풀이  (0) 2016.07.16


이번엔 조금 특이하다.


사용자 정의함수 shell과 printit이 있고 메인에서는 printit만 호출하고 shell함수를 호출하지 않는다.


그러면 우리는 shell함수를 실행시켜주기위해 printit함수로 가는 것을 shell로 돌려주면 된다고 생각할 수 있다.


그러면 디버거를 해보자

(이제부터 Intel로 디버깅을합니다..)

set disassembly-flavor intel


그리고 각 함수의 어셈코드 확인


메인


shell


printit


shell과 main의 시작주소는 각각 0x080484d0, 0x0848500이다.


메인함수에서 보면 printit의 호출함수는 0x0804851e에 있다.


그리고 메모리 구조를 생각해보자면

buf+더미포함 40 그리고 *call 4만큼 크기가 되어 있다는 것도 알 수 있다.


그러면 바로 공격을 하면

(python -c 'print "A"*40 + "\xd0\x84\x04\x08"';cat) | ./attackme

이 되겠다.


그리고 my-pass를 치면..



클리어

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

FTZ Level18 풀이  (0) 2016.07.17
FTZ Level17 풀이(해결)  (0) 2016.07.17
FTZ Level15 풀이(해결)  (0) 2016.07.16
FTZ Level14 풀이  (0) 2016.07.16
FTZ Level13 풀이(해결)  (0) 2016.07.16


앞전 14번과 다른점이라면 이번에 check하는 부분이 포인터라는 점


gdb 사용



크기는 동일하게 0x38, 10진수로하면 56

앞에 14번과 동일하게 메모리 구조를 그리면


buf+더미 40, check 4, crap이 되겠고 마찬가지로 주소확인을 위해 level14때 쓴 프로그램을 다시 재활용한다.



주소가 확인되었고 예상과 맞아떨어졌다.


그러면 이제 디버깅을 해보자

이전과 마찬가지로 <main+32>부분에 BP 걸고 디버깅


0xbfffeb20 40만큼 다음인 0xbfffeb48에 deadbeef를 가리키는 주소값을 넣으면 되겠다.


공격코드를 작성하겠다.

(트러블슈팅 중;;)

------------------------------------------

추가


중간에 계속 메모리주소는 변하지만 상대적인 주소는 변하지 않는다.

고로 디버깅을 아래와 같이 진행하고 주소를 얻어내면 0x80484b2부터0x80484b5까지가 된다.


클리어


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

FTZ Level17 풀이(해결)  (0) 2016.07.17
FTZ Level16 풀이  (0) 2016.07.17
FTZ Level14 풀이  (0) 2016.07.16
FTZ Level13 풀이(해결)  (0) 2016.07.16
FTZ Level12 풀이(EggShell로 해결)  (0) 2016.07.16


마찬가지로 BOF


스택가드와 비슷하다.


바로 디버깅을 하자. (그 전에 망할 권한때매, ./tmp에 복사를 하고 하자..)



사용된 지역변수+더미의 크기는 0x38, 10진수로 환산하면 56이다.


deadbeef를 검사하는 <main+29>부분을 BP를 걸자..


그전에 잠시 GDB를 나와서 프로그램 하나를 아래와 같이 짜보자

프로그램의 용도는 각 변수마다 거리가 어느정도인지 짐작하기 위해 하는 것!


바로 코딩후 동작결과를 보자



buf, check, crap주소를 각각 얻었다! 그러면 메모리 구조를 생각해보면

맨위에 buf+더미 크기40만큼, check 크기4만큼 그리고crap이 확인되었다.


메모리 구조를 간략적으로 알았으니

다시 gdb를 가보자.


그리고 deadbeef를 검사하는 <main+29>부분을 BP를 걸자

그리고 AAAA입력



그러면 이제 메모리 주소도 알았고 0xbfffeda0부터 40만큼 떨어진 곳 0xbfffed8에 0xdeadbeef이 들어가기만 하면 된다.


공격은 간단하다. 40개를 쓰레기값채우고 deadbeef를 채우면끗



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

FTZ Level16 풀이  (0) 2016.07.17
FTZ Level15 풀이(해결)  (0) 2016.07.16
FTZ Level13 풀이(해결)  (0) 2016.07.16
FTZ Level12 풀이(EggShell로 해결)  (0) 2016.07.16
FTZ Level11 풀이  (0) 2016.07.15

+ Recent posts