Description
Category: Pwnable
Source: TAMUctf 2019
Points: 470
Author: Jisoon Park(js00n.park)
Description:
nc pwn.tamuctf.com 4325
Difficulty: medium
Write-up
Pwn4 문제와 비슷한 구성이다. 다만, 입력한 데이터의 앞의 몇 바이트만 ls 뒤에 적용되어서 뭔가 다른 명령어를 써넣기도 힘들도록 되어있다.
다른 방법으로 접근해보자. 여전히 gets() 함수를 통해 입력을 받고 있는데 checksec으로 확인해보면 NX가 enable 되어 있다. stack에 쉘코드를 올리는 방식은 아닐 것 같고, canary가 없는 것을 보니 ROP 또는 RTL 종류의 공격을 시도하면 될 것 같다.
우선 system 함수를 호출하는 곳과 "/bin/sh"라는 문자열이 있는지 확인해 보자. 라이브러리를 뒤질 것도 없이 system()이라는 함수가 존재하고, "/bin/sh"라는 문자열도 어렵지 않게 찾을 수 있다.
system("/bin/sh")가 실행되도록 Buffer overflow를 이용하여 stack을 구성해 보자.
우선, ebp까지의 버퍼를 더미데이터로 채우고, ebp의 자리에도 더미데이터를 쓴다. return address 자리에 system 함수의 주소를 넣고나면 system()함수가 호출될텐데, system 함수는 호출 당시의 stack 구조가 [return address][arg1]이라고 간주할 것이다. 여기서 return address는 뭘로 채우던 관심 없으니 이것도 더미 데이터로 채우고, 마지막으로 arg1 자리에 "/bin/sh" 문자열의 주소를 써주면 공격을 위한 payload가 완성된다.
위와 같은 동작을 하는 exploit을 작성하여 실행시키면 서버의 쉘을 얻을 수 있고 flag를 확인할 수 있다.
Flag : gigem{r37urn_0r13n73d_pr4c71c3}