LOB level 6
LOB (wolfman -> darkelf)
1. cat 명령어를 통하여 darkelf.c 의 소스 코드를 확인합니다.
2. 소스코드 분석
1. char 형 buffer [40] 선언
2. argc 가 2 미만일 경우는 오류 메시지 출력 후 종료
3. 에그 헌터 환경 변수 사용 금지.
4. argv[1][47]과 "\xbf"와 같지 않다면 오류 메시지 출력 후 종료
* strlen(arg[1]) 는 길이를 체크하는 함수입니다. arg[1]의 길이가 48을 넘을 경우에는 오류를 출력하고 종료합니다.
제가 풀었던 level5의 방법과 동일하게 푸셨다면 신경쓰지 않으셔도 됩니다.
5.strcpy 함수 : argv[1]에 있는 것을 buffer에 복사 합니다.
6.printf 로 buffer를 출력 합니다.
7.memset 으로 buffer를 40까지 0으로 초기화 합니다.
3. gdb 권한 문제를 우회하기 위해 tmp에 복사합니다.
명령어 cp 를 통해서 복사 하실 수 있습니다.
4. tmp 로 이동 하여 gdb darkelf 명령어를 입력합니다.
disas main 으로 main을 어셈블리어로 확인합니다.
5. 공격 방법
1. argv[2]에 쉘코드를 넣습니다.
2. gdb로 argv[2]가 메모리에 올라오는 주소를 찾습니다.
3. buffer(40)+ebp(4)+argv[2]의 주솟값 (return adress)
gdb로 argv[2]가 시작되는 주소를 찾습니다.
첫 번째 우회해야하는 것은 argv[1][47]!="\xbf" 입니다.
배열은 0 부터 시작되기 때문에 47을 채우고 "\bf"를 채우면 47의 자리에는 bf가 들어가게 됩니다.
두 번째 우회해야할 것은 argv[1]의 길이가 48 이상이라는 것입니다.
이것은 44+ret 이기 때문에 48을 넘지 않게 되어 걱정하지 않으셔도 됩니다.
그후 제가 실제로 쉘코드를 넣어줄 장소에는 B라는 문자를 넣어줍니다.
x/1000x $esp명령어로 확인 하실 수 있습니다.
자 그럼 42(B)가 시작하는 주소를 찾을 수 있습니다.
넉넉하게 0xbfffc10으로 잡아 줍니다.
그렇다면 아까 위에서 했던 것 처럼
40(buffer)+4(ebp)+argv[2]의 주소) argv[2](쉘코드)
(쉘코드= 주소값의 오차를 제거하기위해 nop을 사용합니다.)
이렇게 입력주면 되겠습니다.
'Study > lob' 카테고리의 다른 글
lob tips (풀기전 알아야할 것들) (0) | 2017.06.12 |
---|---|
LOB 5 (darkelf -> orge) (0) | 2017.06.12 |
LOB level5(orc->wolfman) (0) | 2016.09.13 |
LOB level 4 (goblin -> orc) (1) | 2016.08.01 |
LOB level 3 (cobolt -> goblin) (0) | 2016.08.01 |
댓글