반응형

코드에서 먼저 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 주소를 넣으므로, 메인함수의 retstrcpy가 되게된다.

“AAAA”가 저장된 곳이 strcpyret이고, 그 위 4byte strcpy함수의 destination, 그 위 4bytesource가 된다.

source system 함수의 주소를 넣고, destination“AAAA”(strcpy ret) 주소를 넣으면 strcpyretsystem함수가 된다.

그리고 system함수의 인자를 주기 위해 buffersystem함수주소(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바이트 주었는데 중간에 이상한 값이 들어가 있었습니다. 이 원인을 찾고자 하였다.

 

Breakmemset 이후로 걸고 주소값을 찾았다.

 

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 Redhatbash의 버전이 낮아서 \xff\x00으로 처리하므로

Bash2로 변경하였다.

728x90
반응형

'공부 > 보안' 카테고리의 다른 글

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
블로그 이미지

아상관없어

,