문제의 소스코드를 보자.
할당한 버퍼보다 큰 길이를 읽는다. 여기에서 발생하는 오버플로우로 쉘을 실행시키게 만들면 된다.
이제 실행파일을 분석하자.
add esp, ffffff80h가 char buf[0x80];에 해당하는 코드이다.
나머지 esp값은 push되고 다시 add하니, leave retn하기 전의 esp값은 유지된다.
leave명령어가 mov esp, ebp; pop ebp; 하는 것이니 retn때 돌아갈 주소 값이 buf[0x84]부터 들어있는 것이다.
그래서 scanf로 0x80보다 많이 입력하여 retn의 주소값을 덮어씌우면 두가지 상황이 일어날 수 있다.
1. 잘못된 리턴주소가 감지되고 시그널이 발생한다.
2. 입력한 리턴주소로 eip가 set된다.
내가 알고있는게 정확하진 않지만, 운영체제에서 eip를 읽어 해당하는 주소의 명령을 실행하기 전에, 주소가 프로세스의 메모리 범위를 벗어난다면 시그널이 발생하는 것으로 알고있다.
쉘코드를 넣고 0x84부분에 리턴 주소를 넣는다면, 시그널이 발생하지 않고 명령어를 실행시킨다. 이것을 이용한다.
scanf에 입력할 쉘코드를 짠다.
※주의※
※scanf로 문자열을 읽으면 탭, 엔터, 스페이스바 등 특정 문자를 읽으면 더이상 읽지 않는다.
※해당 16진법 값이 들어있어서 문제풀이에 실패했었다. mov al, 0x0b를 하니 scanf로 문자열을 읽는데 끊겼다. 이 문제는 mov al, 0xff; xor al, 0xf4로 해결
컴파일하고 실행파일을 ida로 디버그한 후 명령어 부분을 save.bin파일에 메모리덤프한다.
0x84배열중 쉘코드를 채우고 남은 부분은 쓰레기 값으로 채운다. 그리고 리턴주소를 더해주면 끝
'system hacking > dreamhack(드림핵)' 카테고리의 다른 글
ssp_000 (0) | 2022.03.03 |
---|---|
basic_exploitation_001 (0) | 2022.02.10 |
gdb attach (0) | 2022.02.10 |
shell_basic (0) | 2022.02.05 |
Opcode: 시스템 콜 (x64 syscall 등등) (0) | 2022.02.05 |