티스토리 뷰
BOF 원정대 - Level1 gate
1. C 코드 및 어셈블리 확인
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);
}
.text:08048430 public main
.text:08048430 main proc near ; DATA XREF: _start+17o
.text:08048430
.text:08048430 dest = byte ptr -100h
.text:08048430 argc = dword ptr 8
.text:08048430 argv = dword ptr 0Ch
.text:08048430 envp = dword ptr 10h
.text:08048430
.text:08048430 push ebp ; Alternative name is 'gcc2_compiled.'
.text:08048431 mov ebp, esp
.text:08048433 sub esp, 100h
.text:08048439 cmp [ebp+argc], 1
.text:0804843D jg short loc_8048456
.text:0804843D
.text:0804843F push offset format ; "argv error\n"
.text:08048444 call _printf
.text:08048444
.text:08048449 add esp, 4
.text:0804844C push 0 ; status
.text:0804844E call _exit
.text:0804844E
.text:08048453 ; ---------------------------------------------------------------------------
.text:08048453 add esp, 4
.text:08048453
.text:08048456
.text:08048456 loc_8048456: ; CODE XREF: main+Dj
.text:08048456 mov eax, [ebp+argv]
.text:08048459 add eax, 4
.text:0804845C mov edx, [eax]
.text:0804845E push edx ; src
.text:0804845F lea eax, [ebp+dest]
.text:08048465 push eax ; dest
.text:08048466 call _strcpy
.text:08048466
.text:0804846B add esp, 8
.text:0804846E lea eax, [ebp+dest]
.text:08048474 push eax
.text:08048475 push offset aS ; "%s\n"
.text:0804847A call _printf
.text:0804847A
.text:0804847F add esp, 8
.text:08048482 leave
.text:08048483 retn
.text:08048483
.text:08048483 main endp
[!] 참고:
구버전의 bash 인 경우, 프로그램으로 명령 인자값을 전달하는 도중 0xff 문자열을 제대로 인식하지 못하는 문제점이 있으므로, bash2 에서 공격을 실행할 것.
> 공략
프로그램 실행 인자로 받은 문자열을 스택에 길이 제한 없이 받아들이고, Stack canary가 존재하지 않음을 이용해,
스택의 RET (ebp+0x4)를 Overwrite 할 수 있다.
256바이트를 스택에 할당한 다음, 실행 인자가 넘어왔는지 확인하고,
프로그램 실행 인자의 두번째 (프로그램의 인자에는 첫번째에 무조건 명령줄이 오게 된다.) 문자열의 끝 까지 ebp-256 주소에 복사하고, printf로 복사한 문자열을 출력하고, 프로그램을 종료하게 된다.
RET을 현재 스택 안에 있는 쉘코드의 주소로 조작하는데, 이 주소값은 항상 변하기 때문에 공격이 성공할 수도, 실패할 수 도 있다.
조금 더 높은 공격 효율을 위해 nop slide 를 사용한다.
[!] nop slide란?
CPU 명령 중 "nop"라는 명령 (아무 동작도 수행하지 않음)
'Reversing > * BOF 원정대' 카테고리의 다른 글
BOF 원정대 - level2 gremlin -> cobolt (argc buffer - env shellcode) (0) | 2016.08.09 |
---|
댓글