본문 바로가기

system/writeup

hackingcamp 2019 secret note

secret_note

hackingcamp 2019 secret_note

이번 햌잉캠프에서 못 푼 두 문제중 마지막 문제이다!

집와서 방금 풀어봤는데 정말 고통스러웠다.

중간에 포기할까 생각을 두번정도 한듯..

저 위에 계신 Nextline님은 두시간 반만에 푸셨다는데 나는 5시간이 걸렸다 ㅎㅎ..

하지만 고통이 컷던만큼 얻어간 것도 정말 많았던 문제이다.

 

Thanks to Wally, 코게 본선 화이팅~

 

NX disabled

 

add 메뉴에서 oobgot의 값을 strdup의 반환 값으로 덮을 수 있다.

 

인덱스가 -27보다 작으면 값이 0이 아니라도 해당 주소의 값을 변경할 수 있다.

 

8바이트만큼 입력할 수 있는데, alphanumeric만 입력할 수 있다.

 

delete 함수에서 stdin을 닫고, free 함수를 실행한다.

 

이 경우, stdin이 닫혀있기 때문에 쉘을 얻지 못한다.

free 함수의 got는 -28번째 인덱스에 존재하여 값을 덮을 수 있다.

 

이를 이용하여 연쇄적으로 쉘코드를 작성하여

execve("/bin/cat", {"cat", "flag"}, NULL)

을 실행시키는 쉘코드를 작성하면 되는데, 정말 힘들다..

우리가 작성해야 할 쉘코드 안에서

non alphanumeric value를 생각해 보면,

 

syscall number에서 0x0b

int 0x80에서 \xcd\x80

/bin/cat에서 /

pop ebx에서 \x5b

 

syscall numberint 0x80, pop ebx는 스택과 레지스터에 인자를 모두 셋팅해둔 후 마지막에 xor 연산을 하면 된다.

 

https://nets.ec/Alphanumeric_shellcode

x86에서 사용할 수 있는 alphanumeric instruction은 위와 같다.

보다시피 사용할 수 있는 레지스터가 eax, ecx, edx밖에 존재하지 않으므로 맨 마지막에 인자를 셋팅해 주는게 편해 보인다.

 

총 8 바이트만큼 입력할 수 있으므로, 앞 6바이트를 연산에 사용하고 뒤 2바이트를 conditional jump로 사용하도록 하자.

 

또한, -32 번 째 인덱스를 계속해서 재사용할 수 있으므로 이를 이용하여 30번 째 인덱스를 넘지 않도록 코드를 짜면 된다.

처음에는 이 사실을 모르고 작성했어서, 이를 사용하지 않았다..

 

일단 스택에 인자를 셋팅해 주면, 침범하면 안되기 떄문에 pop 연산 혹은 push 연산을 통해 stack pointer를 변경해 주고 값 연산을 해주는게 좋다.

 


'system > writeup' 카테고리의 다른 글

pwnable.tw secret of my heart  (0) 2019.03.01
pwnable.tw secretgarden  (0) 2019.02.20
hackingcamp 2019 can you get shell?  (0) 2019.02.19
trustctf 2019 abyss  (2) 2019.02.15
trustctf 2019 start  (2) 2019.02.15