Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- UKPT level
- 국가기록원
- Service
- 연구모임
- MITRE ATT&CK
- 프로젝트
- 화학물질
- 정보보안
- 화학물질안전원
- 국가정보원
- 불법유통근절
- 경기팀
- 기타정보
- webhacking
- 웹 해킹 입문
- Los
- 도구모음
- 여행
- codeup
- 대외활동
- 불법유통
- UKPT
- 파이썬
- suninatas
- 12기
- 국정원
- 화학물질불법유통온라인감시단
- HTML
- PHP
- nurisec
Archives
- Today
- Total
agencies
Joern을 이용한 CPG node edge 생성하기 (deepdfa) 1.1.1072 version 본문
https://github.com/ISU-PAAL/DeepDFA
https://arxiv.org/pdf/2212.08108
※ 논문에 존재하는 before 파일 중 일부
우리는 c 파일로 cpg 파일을 생성하고
생성된 cpg 파일로 nodes 와 edges를 생성해야 합니다.
본 실습은 colab 환경에서 진행되었습니다.
!wget https://github.com/joernio/joern/releases/download/v1.1.1072/joern-cli.zip
!unzip joern-cli.zip -d joern-cli
%cd joern-cli/joern-cli
joern 1.1.1072 버전 설치
!./joern-parse /content/100016.c
cpg 생성하기
생성된 cpg.bin 파일은 위의 경로에 존재한다.
서로 내용이 거의 동일하다
이제 노드를 생성하기 위해
colab 터미널에서 joern 을 실행한다.
(이것도 joern 스크립트로 진행할 수 있으나 지금은 테스트 중이기때문에 터미널 환경에서 진행했다)
joern> 에 아래의 명령을 입력한다.
importCpg(”cpg.bin”)
cpg.all.l
생성된 노드를 before 파일의 nodes 와 비교를 해본다.
내용이 똑같다 (순서만 다르다)
이제 엣지를 생성해보자
%%writefile script3.sc
import java.io.PrintWriter
import scala.jdk.CollectionConverters._
importCpg("cpg.bin")
// 결과를 JSON 파일로 출력할 준비
val writer = new PrintWriter("/content/cpg_edges.json")
writer.print("[")
// 모든 에지 추출
val edges = cpg.graph.edges.l
edges.foreach { edge =>
val inNodeId = edge.inNode.id // inNode ID 추출
val outNodeId = edge.outNode.id // outNode ID 추출
val edgeType = edge.label // 에지의 타입 (예: REACHING_DEF, AST 등)
// VARIABLE 속성에서 값 추출
val extraDataValue = if (edge.propertyKeys.contains("VARIABLE")) {
edge.property("VARIABLE").toString
} else {
"null"
}
// 에지 정보를 JSON 형식으로 출력
if (extraDataValue != "null") {
writer.print(s"""[$inNodeId,$outNodeId,"$edgeType","$extraDataValue"],""")
} else {
writer.print(s"""[$inNodeId,$outNodeId,"$edgeType",null],""")
}
}
// JSON 형식의 배열 닫기
writer.print("]")
writer.close()
이번꺼는 joern 스크립트로 작성되었다.
생성된 스크립트는
!./joern --script script3.sc
명령으로 실행할 수 있다.
순서만 다르지 내용은 똑같다.
4.0.151 버전에서 cpg 를 만들려면 이렇다. (최신버전)
test 폴더에는 .c만 있고
output 폴더에 생성한 .cpg 를 넣고 싶을때
import os
import subprocess
# c2cpg.sh 실행 파일 경로
c2cpg = "/content/set_up/joern-cli/joern-cli/c2cpg.sh"
# 입력 폴더와 출력 폴더 경로
folder_path = "test" # C 소스 코드가 들어 있는 디렉토리
output_folder = "output" # CPG 파일을 저장할 디렉토리
# 출력 폴더가 없으면 생성
if not os.path.exists(output_folder):
os.makedirs(output_folder)
# 입력 폴더 내 .c 파일을 처리
for filename in os.listdir(folder_path):
if filename.endswith(".c"): # .c 파일만 처리
input_file = os.path.abspath(os.path.join(folder_path, filename)) # 입력 파일 절대 경로
output_file = os.path.abspath(os.path.join(output_folder, f"{filename}.cpg.bin")) # 출력 파일 경로
print(f"Processing file: {input_file}")
# c2cpg.sh 명령 실행
command = [c2cpg, "-o", output_file, input_file]
try:
subprocess.run(command, check=True)
print(f"Successfully processed: {input_file}")
except subprocess.CalledProcessError as e:
print(f"Error processing file: {input_file}")
print(f"Error message: {e}")
'Ⅲ. 정보보안' 카테고리의 다른 글
Joern (Deepdfa : nodes edges cpg) 생성 (완료) (2) | 2024.10.09 |
---|---|
joern으로 생성한 노드를 before 형식에 맞게 정렬 (0) | 2024.10.08 |
WSL2 그래픽 환경 사용하기 (1) | 2024.09.09 |
WSL2 재설치 (파일을 찾을 수 없습니다) (0) | 2024.09.09 |
윈도우에 WSL2 설치하기 (0) | 2024.09.09 |