2017/01/11 - [Study :)/FTZ] - [해커스쿨] FTZ level12 풀이과정
소스코드를 보니 long형 변수 i가 존재하고, i의 값이 0x1234567이 아니면 경고 메시지가 출력하는걸 볼 수 있다. 즉, i라는 변수의 값을 체크해서 오버플로우됬는지 판단하는 보안코드라고 볼 수 있겠다.
하지만, 이는 너무 단순한 보안코드이다. 그러면 i형 변수가 가리키는 버퍼에 0x1234567을 넣으면 되지 않을까? 공격하자!
gdb로 분석해보면, 일단 0x418(1048)만큼 공간을 확보하고, 0x1234567을 [ebp-12]에 저장한다.
그리고 strcpy로 argv[1]인자를 복사하고나서 <main+79> 부분에 ebp-12의 값이 0x1234567의 값으로 잘 저장되어 있는지 체크한다.
그럼 우리는 앞서 했던 방식과 똑같은 방법으로 [ebp-12]주소에 0x1234567만 넣어주면 될거 같다.
그러면 일단 [ebp-12]의 주소를 찾아보자.
strcpy함수를 실행하고 나서 바로 다음인 <main+76>에 브레이크 포인트를 걸고 대충 아무값인 "AAAAAAAAAA"값을 인자로 넣어서 실행시켜보자.
브레이크 포인트가 걸리고 나서 ebp-12를 보니 주소값이 "0xbfffe33c"이다.
"AAAAA..."의 문자가 들어가는 메모리주소는 "0xbfffdf30"이다. 계산기로 0xbfffe33c에서 0xbfffdf30을 빼보니 1036이라는 값이 나왔다. 즉. 처음 문자가 들어가는 메모리주소부터 1036번째에 0x1234567을 넣으면 되겠다.
정리하면 총 1048byte의 공간을 할당 받고, 1036byte+0x1234567(4byte)+8byte+SFP(4byte)+RET(4byte).
`python -c 'print "A"*1036+"\x67\x45\x23\x01"+"A"*12+"쉘코드가 들어간 환경변수 주소"
자 우리가 생각한데로 되는지 해볼까? (쉘코드 들어간 환경변수 주소 : 0xbffffeb6)
환경 변수에 대한 설명은 ☞ http://eunice513.tistory.com/56