목록전체 글 (166)
Pwnstar

문제 순서대로가 아닌 문제를 푼 순서대로 라업을 쓰려고 한다. 언익스2번도 1번과 거의 비슷한 문제이다. NX만 걸려있고, main함수 구성과, system plt가 존재하는 것까지 똑같은데, 1번과 달리 sh 문자열을 사용할 수가 없다. 지금 생각해보면 되게 멍청한 시도였는데 이 시도 덕분에 system 함수의 새로운 기능을 알게 되었다. main함수에도 보이듯이 sh 문자열이 존재하기는 해서 이 부분의 주소를 rdi에 넘겨주고 system 함수를 실행시켜 보았는데 문자열을 넣은 부분이 그대로 출력이 되었다. 혹시 system 함수가 puts나 printf 함수와 같은 기능도 할 수 있지 않을까 싶어서 이 함수를 이용해서 libc leak을 해보았다. 예상대로 libc leak에 성공했다. 어쩌다 얻어..

원래 HackCTF도 라업을 전부 쓰려고 했었는데, 굳이 안그래도 되는 문제들이 많아서 이전 문제들은 제끼고 언익스 1번부터 쓰려고 한다. 보호기법은 NX만 걸려있다. main 함수는 상당히 짧다. 변수 s의 크기가 0x10인데 fgets함수로 64만큼 입력을 받으니 쉽게 bof가 가능할 것 같다. gift라는 함수에 system_plt도 있으니 rdi에만 제대로 값을 넣고 넘겨주면 될 것 같다. 그런데 문제는 /bin/sh\x00 문자열을 입력받고 넣어주기에는 64바이트가 충분하지 않을 것 같아서 /bin/sh나 sh문자열이 또 따로 존재하는 지 찾아봤다. /bin/sh 문자열은 있었으나 libc에 있었고, 이 libc를 leak하기에는 또 칸이 모자랄 것 같아서 sh를 찾아보니 0x4003bf 주소에..

드디어 루키스 문제이다. brain fuck이라는 문제인데, 링크로 들어가면 libc파일 하나와 바이너리 파일 하나를 다운받을 수 있다. 우선 보호기법을 확인해보자. 32비트 파일이고, 카나리와 NX가 걸려있다. 내가 brain fuck이라는 언어를 모른다는 것이 문제를 풀 때 큰 장애가 될 것 같았는데 막상 풀어보니 그렇지도 않았다 오히려 문제는 다른 곳에서 터졌다. IDA 아이다로 열어본 메인함수이다. []를 제외한 브레인퍽 문법을 입력하라는데 이 부분에서는 fgets로 입력받기 때문에 bof가 불가능할 것 같다. do_brainfuck 함수이다. 이렇게 되어있는데 간단히 설명하자면 "+" "-" "," "." ">" ",>,>,>,>,>,>," #write "/bin/sh\x00" in bss ->..

from pwn import* flag = "\x48\xBB\x6F\x30\x6F\x30\x6F\x6E\x67\x00\x53\x48\xBB\x6F\x30\x6F\x30\x6F\x30\x6F\x30\ x53\x48\xBB\x30\x30\x30\x30\x30\x30\x30\x30\x53\x48\xB p = remote("pwnable.kr", 9026) p.recvuntil("give me your x64 shellcode: ") p.sendline(flag) p.interactive() 이 문제를 마지막으로 우선은 토들러를 끝내고 루키스 문제들의 라업을 쓰려고 한다. 루키스 문제들은 어서 라업을 쓰지 않으면 금방 잊어먹을 것 같다. 쉘코드를 만들란다. 우선 들어가보자 들어가면 바이너리, 소스코드, read..

호크룩스..해리포터에 나오는 볼트모트의 영혼을 조각내 넣어놓은 물건들을 호크룩스라고 하던데.. ROP문제란다ㅎㅎㅎㅎ 접속해보니 소스코드가 없고 readme 파일이 있길래 한번 봤다. 음 별건 없고 nc로도 접속할 수 있다. 그러면 바이너리를 빼와서 IDA에 넣어봐야겠다. IDA 메인 함수에는 별다른 단서가 없다. init_ABCDEFG() 함수를 보자 랜덤값으로 a, b, c, d, e, f, g, v0 의 값이 정해지나보다. 이 값들을 모두 더한 값이 sum이라는 전역변수에 들어간다. 그 다음 ropme 함수를 들여다보자 이 함수가 사실상 메인일듯 하니. 이렇게 생겼다. 메뉴를 선택하라는 말이 나오는데, 아까 init_ABCDEFG 함수에서 나오는 값들을 메뉴에 입력으로 줘야 각 함수에 도달할 수 있는..

blukat이라는 문제이다. 이 문제는 실수...라기 보단 옆에서 문제푸는 걸 보고 있던 친구가 절대 복잡하게 생각하지 말라는 말을 듣고 정말 간단하게.. 단순하게 풀었다. 힌트가 만약 이 문제가 너무 어려우면 당신은 숙련된 플레이어란다....나는 숙련되지 못했다..ㅎㅎㅎ 일단 서버로 접속하면 이렇게 세 개의 파일이 있고, 소스코드가 이렇게 되어있다. password라는 파일에서 100만큼 읽어와서 password 변수에 저장하고, 그 내용과 입력받은 값을 비교하여 플래그를 출력하는 간단한 방식이다. 당시에 풀 때에는 password 내용을 사실 볼 수 있는게 아닐까??라는 생각이 들어 한 번 확인해본게 맞아 떨어져서 쉽게 풀었다. 즉, 보통 볼 수 없는 파일을 확인하려고 할 때 저런 식으로 문구가 뜬다..

저번 문제와 이어서 힙 문제이다. 우선, 32비트 바이너리이고, NX와 partial relro만 걸려있다. 소스코드 #include #include #include typedef struct tagOBJ{ struct tagOBJ* fd; struct tagOBJ* bk; char buf[8]; }OBJ; void shell(){ system("/bin/sh"); } void unlink(OBJ* P){ OBJ* BK; OBJ* FD; BK=P->bk; FD=P->fd; FD->bk=BK; BK->fd=FD; } int main(int argc, char* argv[]){ malloc(1024); OBJ* A = (OBJ*)malloc(sizeof(OBJ)); OBJ* B = (OBJ*)malloc(s..

이번에는 앞의 두 문제를 건너뛰고 uaf와 unlink 순서대로 라이트업을 쓰려고 한다. 이유는 이 두 문제 모두 스스로의 힘으로 풀지 못하고 룸메 도움을 많이 받았는데, heap 문제를 처음 접해봐서 그런지 이해가 잘 가지 않았기 때문이다. 더 확실히 이해하기 위해 천천히 다시 풀어보면서 라업을 써보려고 한다. 우선은 64비트 바이너리이고, 보호기법은 NX밖에 걸려있지 않다. 소스코드 #include #include #include #include #include using namespace std; class Human{ private: virtual void give_shell(){ system("/bin/sh"); } protected: int age; string name; public: vir..