| 해쿨러 |
1. 환경변수에 쉘코드를 넣을떄 NOP가 16개 이상 필요한 경우
환경변수의 주소를 어떻게 찾아내셨는지, GDB로 보셨는지 아니면 에그쉘을 사용해 에그쉘에서 출력하는값을 사용하셨는지 모르겠는데
스택에 맨끝에 보면 0xc0000000 직전에 프로그램 이름이 들어갑니다
그 아래 주소에 들어가는 것들, 예를 들어 환경변수의 시작 주소도 프로그램 이름의 길이에 영향을 받습니다
만약 gdb로 환경변수 주소를 찾으신다음에 쉘에서 공격하신 거라면 gdb에서는 절대경로로 실행하기 떄문에
/tmp/attack/this 이런식으로 스택 맨끝에 들어가게 되고, 16글자
쉘에서 만약 상대경로로 하셨다면
./this 로 실행하면 6글자
이렇게 되면 환경변수의 시작점이 gdb에서와 쉘에서 10바이트가 차이나게 됩니다
환경변수를 사용하지 않는 경우에서도 이런 유사한 경우가 생기는데
지역변수에 쉘코드를 넣고 지역변수로 리턴하는 경우 쉘코드의 끝과 ret사이의 거리가 16바이트가 필요합니다(\x31\xc0으로 시작하는 혹은 \x6a\x0b로 시작하는 23바이트 혹은 25바이트짜리 쉘코드 기준)
2. 이것도 1번과 마찬가지 문제입니다. gdb에서 봤을땐 0xbfffff2c였을지 몰라도 쉘에서 실행할때는 0xbfffff34일수도 있습니다
이런식의 혼란을 방지하기 위해선 쉘에서 공격하실때 프로그램의 절대경로를 사용해 실행하시면 gdb와 같은 스택이 생깁니다
그리고 앞으로 이런식으로 그냥 여러번 시도하는것만으로는 문제를 파악하기 어려워 지는데, 시도하는것만 아니라 디버거로 분석하는 습관을 잘 들이셔야 합니다
안되면 무조건 gdb부터 바로 켜서 하나하나 트레이스 해나가시면 혼자서도 많은 문제를 해결할 수 있습니다 |
2017/03/15 |
|