본문 바로가기

System Hacking

[Dreamhack] out_of_bound 풀이 - 티스토리

 

 

코드를 보면 idx로 command 배열의 인덱스에 접근하는데 인덱스 범위를 검사하는 코드가 없기 때문에 Out Of Bound가 발생한다

 

 

 

따라서 name에 적절한 문자열을 삽입하고 oob를 이용해서 읽어 flag를 따면 된다

 

 

두 변수의 위치 차이는

 

 

76바이트 이다

 

 

 

따라서 인덱스로 접근하면 command[19]을 읽을 시 name을 읽을 수 있다

 

 

 

처음에 접근은 name에 /bin/sh 문자열을 입력한 뒤 idx에 19를 입력해 command[19] 접근해서 /bin/sh을 읽으려 했다

 

 

 

그러나 쉘이 안 따여서 삽질 끝에 질문 창 찾아봤는데 

 

 

 

system함수는 인자로 const char* 을 받는 함수이기 때문에 문자열의 주소 값이 위치해야 된다

 

 

근데 /bin/sh을 입력할 경우 메모리에 저장되는 /bin/sh의 아스키 값은 /bin/sh의 주소가 아니므로 쉘이 안 따인다

 

 

 

따라서 name의 위치에 name + 4의 주소를 넣고 name + 4에 /bin/sh을 위치시키면

 

 

system이 name + 4의 주소를 읽고 찾아가 /bin/sh을 읽게 된다

 

 

 

 

 

** /bin/sh을 바이트 문자열로 바꿔서 전송 했는데 이거는 좀 헷갈려서 실험해봄

 

b'\x5e' 이 형태로 pwntools로 전송 시 메모리에 그대로 b'\x5e'로 저장이 된다

 

-> 이유로는 b'\x5e' 이 형태는 이미 메모리에서 리틀엔디안 식 바이트 문자열로 저장한 형태이기 때문에 그대로 읽는다

 

반면에 0x5e6e 이 형태로 전송 시

 

메모리에 b'\x6e\x5e'형태로 리틀엔디안 식에 맞게 바이트 문자열 형태로 변환 돼 저장이 된다.

 

결론은 내가 원하는 문자열 그대로 전송하려면 저대로 보내면 됨