본문 바로가기

분류 전체보기

(25)
[HackCTF] RTL_World Write Up 이름 그대로 RTL을 이용하는 문제이다. checksec 을 확인해보면 32비트에 nx가 켜져있다. 그런데 막상 바이너리를 실행해보니 바로 Segmantation fault 가 떠서 이것저것 검색해보니 64비트 linux에서 32비트 바이너리를 실행해서 그렇다는데... 자세히는 모르겠지만 아마 저 바이너리가 32비트 os 에서 컴파일된 것 같다. 그래서 이것저것 찾아보다가 sudo apt-get install gcc-multilib g++-multilib 이거한번 해주니까 정상적으로 실행이 됐다(저거 둘다 이미 깔았던건데 왜된건지 모르겠음) 아무튼 이렇게 실행이 되는걸 확인하고 실행해보니까 뭐가 많이뜬다. 그리고 gdb로 열어보니 이렇게 심볼들도 멀쩡하다. 아무튼 여기까지 보고 그냥 바로 IDA로 코드를..
Pwnable 환경 세팅 VMWare Workstation 16 Ubuntu 20.04 사용 glibc 버전 - 2.31 초기 설정 sudo apt-get update sudo apt-get upgrade git 설치 sudo apt-get install git gdb-peda, Pwngdb 설치 git clone https://github.com/longld/peda.git ~/.peda echo "source ~/.peda/peda.py" >> ~/.gdbinit git clone https://github.com/scwuaptx/Pwngdb.git cp ~/Pwngdb/.gdbinit ~/ gcc 설치 sudo apt-get install gcc sudo apt-get install gcc-multilib g++-multi..
[Dreamhack] pwn-library Write-up 보호되어 있는 글입니다.
[HackCTF] x64 Simple_size_BOF Write Up 이번엔 64비트 바이너리 이다. 어김없이 i fu 그리고 main함수 확인 처음에 puts가 있길래 뭘출력하나 봤더니 저런문구가 있다ㅋㅋㄳ 아무튼 맨처름 sub rsp, 0x6d30 을보니 0x6d30 크기의 버퍼를 할당하고밑에 gets함수로 입력값을 넣어주는것같다. 근데 6d30이면 27952인데 버퍼가 매우크다 그리고 printf 함수는 아까 저 버퍼의 주소를 인자로 넣어주는것을 보니 우리가 넣을 버퍼의 주소를 알려준다. 대놓고 버퍼에 쉘코드넣고 bof로 ret 덮어서 점프하라는것 이므로 바로 payload 작성 유의해야할 점은 64비트이므로 이전문제랑 쉘코드가 다름. from pwn import * shell = "\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xf..
[HackCTF] 내 버퍼가 흘러넘친다!!! Write UP 먼저 i fu 로 함수목록 확인 그리고 main함수 확인 먼저 20바이트짜리 버퍼 할당하고, 0x804a060에 50바이트 받아서 넣는듯하다. 그리고 할당한 20바이트 버퍼에 gets함수로 또 입력을 받는데 이것만봐도 두번째 입력에서 bof를 이용해 ret를 덮으라는것을 알 수 있음. 그리고 ELF 정보를 확인해보니 NX bit가 활성화가 안되있다. 그럼 저 전역변수 0x804a060에 쉘코드 넣고 ret덮어서 점프하면 될것같다. payload 작성 from pwn import * shell = "\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x31\xc9\x31\xd2\xb0\x08\x40\x40\x40\xcd\x80" #r = proces..
[HackCTF] x64 Buffer Overflow Write Up 이번에도 IDA로 먼저 열어보았다. 268바이트의 버퍼에 scanf함수로 입력값을받고 strlen으로 문자열 길이를 v5에 저장하고 입력받은값을 출력하고 종료하는 코드인 듯 하다. 함수목록을 보니 뭐 어디 다른함수를 호출하지는 않고 숨겨진 함수 callMeMaybe 를 호출하면 될것같다. 이전문제처럼 호출할 함수 주소를 바꾸는게아니라 scanf로 main함수의 ret주소를 덮어주는 문제인듯? 그래서 일단 ret주소의 위치부터 알아보았다. 그냥 bp찍고 직접가보니까 역시 0x7ffff7dea0b3 주소로 돌아가는것을 확인. scanf 입력후의 스택상태를 보니 df10부터 e028 라인까지 버퍼를 채우고 그다음 방금찾은 ret주소부분을 callme 함수주소로 덮어주면 될것같다. 0xe028 - 0xdf10 ..
[HackCTF] Basic_BOF #2 Write Up 먼저 IDA로 바이너리파일을 열어보았다 v5에 sup함수의 주소를 넣고 호출하는것같다. bof로 v5를 shell로 덮으면 되는 문제인듯. 이제 리눅스로 넘어가서 gdb로 열어보자 main+59에 bp를 걸고 아무값이나(aaa)를 넣고 보니 sup함수의 주소는 eax에 0x80484b4가 들어가있는것으로 알 수 있고 입력버퍼의 크기가 128바이트 이므로 128바이트의 아무값 + shell함수의 주소 를 넣으면 될것같다. 이때 shell의 주소는 여기있는 0x0804849b를 넣어주었다. 그리고 실행하니 쉘을 얻을수있었음.
Assembly Handray2 Homework2 먼저 i fu로 함수목록을 확인함 이전문제와 비슷하게 main -> func로 추정 main함수의 구조를 보니 호출규약이 x64 fastcall 인듯하다. 그리고 0x4006c4에 있는 문자열인 "점수를 입력하세요 : " 를 매개변수로하여 printf 함수를 호출하고 scanf함수로 정수를 입력받고 func함수의 리턴값 문자로 "%c 등급입니다. \n" 를 출력하는것으로 예상됨. 그리고 printf 앞에 mov DWORD PTR[rbp-0x4], 0x0 은 int 형 변수를 선언하고 초기값0을 할당하는듯.(근데 scanf에서 쓸건데 굳이 0으로 초기화를 해준건지 int형 변수 선언만하고 초기화를 안해도 기본값이 0인지 쓰레기값인지 컴파일러에 따라 다른것같같은데 그건 모르겠고 그냥 0으로..