코드에서 먼저 memcmp을 하여 argv[1] + 44 위치에 strcpy의 주소가 있는지 체크를 한다.
그리고 strcpy(buffer, argv[1])을 하여 argv[1]을 buffer로 복사한다.
그 다음 memset(buffer+40+8, ‘A’, 4)를 하여 buffer 위 ret위를 “AAAA”로 채운다..
Argv[1] + 44 위치에 strcpy 주소를 넣으므로, 메인함수의 ret이 strcpy가 되게된다.
“AAAA”가 저장된 곳이 strcpy의 ret이고, 그 위 4byte는 strcpy함수의 destination, 그 위 4byte는source가 된다.
source 에 system 함수의 주소를 넣고, destination에 “AAAA”(strcpy의 ret) 주소를 넣으면 strcpy의 ret은 system함수가 된다.
그리고 system함수의 인자를 주기 위해 buffer에 system함수주소(4) + ret(더미) + “/bin/sh”주소(system함수의 인자)를 채우고 buffer 주소를 source에 넘기면 system함수의 인자도 동시에 줄 수 있다.
Sub $0x2c, %esp => 44byte를 할당하므로 buffer위에 더미 값은 할당되지 않는다.
P strcpy, p system으로 각 주소를 얻는다.
Strcpy = 0x8048410, system = 0x40058ae0
“/bin/sh”의 주소를 얻는 코드를 작성하여 주소 값을 얻는다.
/bin/sh =>0x400fbff9
혹은
환경 변수를 추가하여 찾을 수도 있다.
Buffer = 0xbffffaa0
&ret+4 = 0xbffffad4
Strcpy = 0x8048410, system = 0x40058ae0, /bin/sh = 0x400fbff9, Buffer = 0xbffffaa0, &ret+4 = 0xbffffad4를 구하였다.
따라서 payload를 적으면 $(python -c 'print "\xe0\x8a\x05\x40" + "A"*4 + "\xf9\xbf\x0f\x40" + "\x90"*32 + "\x10\x84\x04\x08" + "A"*4 + "\xd4\xfa\xff\xbf" + "\xa0\xfa\xff\xbf"')가 된다.
실행 결과
Segmentation fault가 나와 명령어를 다시 살펴보았다.
예상한 값이 들어가지 않은 것을 알 수 있었다.
/bin/sh 뒤에 NOP명령어를 32바이트 주었는데 중간에 이상한 값이 들어가 있었습니다. 이 원인을 찾고자 하였다.
Break를 memset 이후로 걸고 주소값을 찾았다.
buffer => 0x bf ff fa b0 (그림 잘못표기함)
Ret+4 -> 0x bf ff fa e4
$(python -c 'print "\xe0\x8a\x05\x40" + "A"*4 + "\xf9\xbf\x0f\x40" + "\x90"*32 + "\x10\x84\x04\x08" + "A"*4 + "\xe4\xfa\xff\xbf" + "\xb0\xfa\xff\xbf"')
Buffer의 시작 주소를 0xbffffaa0
Ret + 4 주소를 0xbffffad4로 바꾸어 실행해보았습니다
하지만 작동하지 않았다.
하지만 여전히 원인을 찾지 못하여 이때까지 실행한 결과를 적는다...
추가로 LOB Redhat은 bash의 버전이 낮아서 \xff를 \x00으로 처리하므로
Bash2로 변경하였다.
'공부 > 보안' 카테고리의 다른 글
SystemProperties로 에뮬레이터 탐지 (0) | 2021.05.03 |
---|---|
BOF 원정대 level 16 (0) | 2021.05.03 |
간단한 버퍼 오버플로우 (0) | 2021.04.28 |
Data type, Array operations, Byte ordering (0) | 2021.04.28 |
MyEtherWallet 해킹사건 분석 (0) | 2021.04.18 |