전체 글

* 깃허브: https://github.com/Ellie010707
attackme의 코드를 읽어봅시다.함수 포인터와 fgets함수가 사용되었는데 이는 버퍼오버플로우를 이용해 main함수의 리턴 값(call함수의 함수포인터를 초기화)을 shell함수의 시작주소로 바꿔라 라는 의미입니다. 메인함수를 살펴보면 함수 포인터 선언부분이 ebp-16인데 fgets함수에서 56바이트만큼 입력받습니다. 그러므로 40바이트는 쓰레기 값을 주고 나머지 16바이트에 0x8048500대신 shell함수의 시작주소를 넣어주면 됩니다. shell함수의 시작주소를 얻었습니다. (python -c 'print "\x90"*40+"\xd0\x84\x04\x08"'; cat)|./attackme 끝!
attackme의 코드를 살펴보았습니다.level14랑 다른 점은 포인터를 사용하였다는 것 밖에 없는것같습니다.즉, 0xdeadbeef의 주소를 찾아서 if문을 만족시켜주면 되는 문제입니다. level14와 마찬가지로 56바이트만큼 입력받고, ebp-16부터 검사해줍니다.우선 0xdeadbeef의 주소부터 알아냅시다. 0x080484b0~0x080484b2 까지 살펴보았습니다.사진처럼 0x080484b2에 deadbeef가 저장되 있는 것을 보실 수 있습니다. (python -c 'print "\x90"*40 + "\xb2\x84\x04\x08"';cat)|./attackme 끝!
attackme의 코드를 훑어봅시다.각가 crap 4바이트 check 4바이트 buf 20바이트를 할당해주고 fgets함수로 buf에 입력 받은 값을 집어넣습니다.이번 문제는 if문을 실행하는 부분의 메모리주소만 찾으면 되겠습니다. 56바이트 만큼의 공간을 할당하고 값을 받아옵니다. ebp-16 에서 if문의 조건절을 검사하므로 굳이 메모리의 구조를 알지 못하더라도 쓰레기값을 40바이트를 주고 0xdeadbeef를 넣으면 shell을 얻을 수 있다는 것을 알아냈습니다. (python -c 'print "A"*40 + "\xef\xbe\xad\xde"';cat)|./attackme 끝!
hint파일을 보니 attackme의 코드가 나와있습니다.간단하게 분석하고 넘어갑시다. 스택 가드는 오버 플로우를 방지하기 위해서 넣은 것으로 리턴 주소 앞에 있어서 스택 가드의 주소가 바뀌면 오버 플로우가 일어난 것이라고 보면 됩니다.( KILL의 SIG 11이 세그먼트 폴트를 띄움 ) 처음에 1048바이트를 할당하지만 buf는 1024 바이트이기에 24바이트가 남습니다.코드를 살펴보면 메모리의 구조는 | buffer: 1024 byte | dummy: 12 byte | i: 4 byte | dummy: 8 byte | SEP: 4 byte | RET: 4 byte | 이렇게 생겼습니다. export SHELLCODE=`python -c 'print"\x31\xc0\x50\x68\x2f\x2f\x73\..
lim.dev
코딩림