목록분류 전체보기 (365)
입력받을 사이즈를 지정할 수 있다. 사이즈가 -1이 되면 0xffffffff만큼 입력받을 수 있다. ret까지 48byte이다. 먼저 libc계산을 위해 printf의 실제 주소를 얻는다. 020을 libc database에 검색하여 libc 몇 버전인지 찾은 후 rop를 진행한다. from pwn import * p = remote("ctf.j0n9hyun.xyz",3019) #p = process("./pwning") elf = ELF("./pwning") context.log_level = "Debug" p.sendline("-1") payload = "A"*48 payload += p32(elf.plt['printf']) payload += p32(elf.symbols['vuln']) payloa..
처음 fsb를 이용하여 푸는 줄 알았으나 BOF가 가능하기에 그냥 가젯들을 모아서 쉘을 따기로 했다. 사실 모을 가젯도 pop ret밖에 없다.
ret까지의 offset이다. rop기법을 활용한다. 정적 링크인 것을 확인할 수 있다. 이래서 디컴파일 하는데 오래 걸렸다. 가젯들을 모은다. 가젯에 system함수가 없어서 다른 방법을 사용해야 한다. NX가 걸려있어서 shellcode를 사용 못하지만 mprotect를 사용하면 사용할 수 있다고 한다. mprotect는 영역에 권한을 부여할 수 있는 함수라고 한다. mprotect(버퍼 처음 주소, 크기, 권한) 0x7이 chmod에서 권한 설정하는 것처럼 rwx 권한을 모두 부여하는 것이다. from pwn import * p = remote("ctf.j0n9hyun.xyz",3017) elf = ELF("./lookatme") shellcode = "\x31\xc0\x50\x68\x2f\x2f\..
heap구조를 그렸다. 우리가 입력할 수 있는 v3+1의 data영역을 채워서 v4안에 있는 v4+1이 담겨있는 곳을 exit got주소로 바꾼다. v4+1 입력이 진행될 때 flag함수를 적는다. 0x400826이 flag를 출력해주는 함수이다. exit got에 0x400826주소로 덮는다. dummy가 40인 이유는 v3+1의 data가 16byte v4 의 header가 16byte v4의 data영역의 8byte
문제 이름답게 rtl을 사용하도록 한다. rtl은 많이 사용하고 앞으로의 문제에서도 계속 나오기에 이번 포스팅에서는 생략한다. 패스코드를 입력하라고 나온다. check_passcode를 통해 나온 반환 값이 hashcode와 같으면 함수를 실행한다. hashcode의 값은 0xc0d9b0a7이다. 입력한 값을 차례대로 5번 더했을 때 0xc0d9b0a7이 나와야 한다. 매개변수가 char에서 int형으로 받기 때문에 4byte씩 끊긴다. paylaod를 이렇게 보내면 if구문을 통과할 수 있다. 0xc0d9b0a7 + 0 + 0 + 0 + 0 = 0xc0d9b0a7이기 때문이다. core에서는 read를 사용할 수 있다. 여기서 rtl를 사용한다. passcode를 통과하면 printf의 실제 주소를 얻..
프로그램을 실행하면 난수가 생성되며 입력을 받는다. 그 난수를 입력하면 성공이다. 해당 프로그램에서는 srand(time(0))을 사용한다. 시간에 따라 난수가 변한다. 그래서 동시에 난수를 생성하여 전송하면 된다. c코드로 rand값을 출력하게 한다. 파이프라인을 이용해서 동시에 실행되게 한다. -------- 삽질했던 문제
환경변수를 알려주는 간단한 프로그램이다. 근데 bof가 일어난다. c++을 gdb 하면 함수명이 깨져서 나오는데 이 명령어로 고칠 수 있다. ret까지의 offset은 1048이다. spawn_shell의 주소로 덮는다. 겁주는 문제? 인듯하다
시를 입력하고 저자의 이름을 입력할 수 있다. 그 결과로 점수를 주는데 이게 1000000으로 만들어야 한다. 디컴파일을 했다. main함수이다. dword_6024e0이 점수를 채워야할 변수이다. 첫 번째로 실행되는 함수 get_poem이다. poem을 입력받고 return 한다. dword_6024e0을 0으로 초기화한다. get_author함수이다. gets함수로 unk_6040a0에 입력을 받는다. rate_poem함수이다. 단어에 따라 점수를 얻는다. dword_6024e0을 덮기 위한 방법을 찾았다. get_author의 gets함수로 dword_6024e0을 덮어야 한다. 둘 다 전역 변수로 선언되어 있으며 dword_6024e0이 더 높은 주소에 위치해 있다. 64개의 dummy를 넣고 1..