728x90
반응형
목차
1. 더 빠르고 쾌적한 공공와이파이가 온다! (220708)
2. 2022년 국가연구개발 우수성과 100선 선정 추진 (220711)
3. 가상융합경제 안전한 성장을 위해 보안업계 맞손 (220714)
4. 무인기 기반의 안전한 데이터 수집을 위한 클러스터 헤드 선출 보안 기술 동향 (220713)
4. 2022년 상반기 KISA 사이버 위협 동향 보고서 (220715)

1. 더 빠르고 쾌적한 공공와이파이가 온다! (220708)

(출처: 과학기술정보통신부, 보도자료, 정보보호네트워크정책관 네트워크안전기획과 구본준 과장(044-202-6430), 송창종 사무관(044-202-6431))

  • 22년 7월 시내버스 4,200대부터 5세대(5G) 백홀 와이파이로 단계적 전환
  • 올해는 신기술인 와이파이 6E*를 활용하여 공공와이파이를 구축할 예정

21년 하반기 제품 출시된 와이파이 규격으로, 2.4, 5㎓만 활용하는 기존의 와이파이 6 비해 6㎓ 대역을 추가 사용하여 체감속도 및 동시접속 안정성 향상


2. 2022년 국가연구개발 우수성과 100선 선정 추진 (220711)

(출처: 과학기술정보통신부, 보도자료, 성과평가정책국 성과평가정책과 이은영 과장(044-202-6920), 성인제 사무관(044-202-6922))

  • 국가연구개발사업을 통해 창출된 전년도 연구성과 중 기술 분야별 가장 우수한 성과를 선정하는 대한민국 유일의 범부처급 국가연구개발 우수성과 선정제도

[사례1] 다양한 나노물질에서의 광반응 현상 연구

  • 핵심 연구성과: 초극단시간 분해 분광 실험장비의 개발 및 최적화

[사례2] 간암치료를 목적으로 비수술적 치료법인 동맥화학색전술에 사용되는 미세구체의 개발

  • 핵심 연구성과: 부작용은 줄이고 사용은 편리한 국산제품 상용화

[사례3] 세노바메이트, 미국 FDA 시판허가 및 유럽지역 기술 수출 계약

  • 핵심 연구성과: 우리나라 최초로 신약 후보물질 발굴부터 글로벌 임상 개발, 판매 허가까지 전 과정을 독자적으로 진행하여 미국 FDA 승인 및 진출에 성공한 뇌전증 치료제 개발

[사례4] 고 에너지밀도 전지 제조를 위한 핵심 원천 기술 개발 및 지식 재산권 확보

  • 핵심 연구성과: 순수 우리 기술로 만든 전기자동차용 양극재 개발

3. 가상융합경제 안전한 성장을 위해 보안업계 맞손 (220714)

(출처: 과학기술정보통신부, 보도자료, 정보보호네트워크정책관 정보보호기획과 신대식 과장(044-202-6440), 김장호 서기관(044-202-6441))

  • 과학기술정보통신부와 한국인터넷진흥원은 가상융합경제의 확산에 따라 「확장가상세계(메타버스)‧대체불가토큰(NFT) 보안협의체」 발대식 개최
  • 사이버보안 패러다임 변화에 대응하여, 제로트러스트, 공급망 보안 등 보안체계를 기반시설에 적용하기 위한 '사이버보안 패러다임 대응 연구반' 운영

4. 무인기 기반의 안전한 데이터 수집을 위한 클러스터 헤드 선출 보안 기술 동향 (220713)

(출처: 정보통신기획평가원, 주간기술동향 2054호, 한국전자통신연구원 왕기철 책임연구원(062-970-6531), 김재인 선임연구원, 김성창 책임연구원)

  • 무인기 기반의 IoT 네트워크에서 효율적인 데이터 수집 및 분배를 위해서는 클러스터 구조의 활용이 필요
  • 데이터 수집을 안전하게 하기 위해서는 클러스터 헤드(Cluster Head: CH)들의 선출을 안전하게 수행하는 것이 필수적

5. 2022년 상반기 KISA 사이버 위협 동향 보고서 (220715)

(출처: 한국인터넷진흥원 인터넷침해대응센터(KISA 인터넷보호나라&KrCERT), 보고서, 침해사고분석단 종합분석팀)

(출처2: (220725) 한국인터넷진흥원, 지식플랫폼 > 동향분석 > 사이버 위협 동향, 침해사고분석단 종합분석팀, https://www.kisa.or.kr/20205/form?postSeq=1022&page=1#fndoDocumentPreview)

  • 요약: 랜섬웨어 갱단의 활발한 활동과 가상자산의 공격 피해
  • 랩서스(Lapsus$): 가장 활발하게 활동한 랜섬웨어 갱단, 2021년 12월 브라질 보건부 해킹을 시작으로 올해 마이크로소프트, 엔비디아, 옥타(Okta) 등 글로벌 보안 전문기업 해킹
  • 블랙캣(BlackCat): 2022년 상반기 새로 모습을 드러낸 랜섬웨어 갱단
  • + 콘티(Conti), 락빗(Lockbit), ...

국내외 사이버 위협 동향

1. 세계 주요 기업 Lapsus$ 공격으로 인해 피해 발생

세계 주요 기업 Lapsus$ 공격으로 인해 피해 발생
Lapsus$의 주요 공격 방식

2. 러시아-우크라이나 하이브리드 전쟁, 또 하나의 전쟁터가 된 사이버 공간

3. 사이버 공격 하는 북한, 사이버 공격 받는 북한

  • 북한 연계 피싱 공격 지속: 2월, 국내 군사 연구 및 동북아 평화 협회인 것처럼 위장해 외교·안보·국방분야 전문가를 겨냥해 프로필을 보내달라면서 프로필 양식 문서로 위장한 MS 워드 악성 파일을 첨부한 피싱 메일 발송

4. 여전히 기업 비즈니스의 큰 위협인 랜섬웨어

5. 블록체인 브리지, 해킹으로 대규모 가상자산 피해 잇따라 발생

  • 블록체인 브리지에서 사고가 나는 이유: 복잡한 요구사항을 처리하고, 많은 가상자산을 보유해 주요 공격 대상이 됨
  • 다양한 가상자산을 처리하는 크로스체인 DeFi에서 브리지를 많이 사용

6. 비밀번호 해킹과 피싱으로 피해가 계속되는 NFT

7. 클레이튼 기반 DeFi KLAYswap, 해킹으로 약 22억 원 피해

  • 국내 대형 DeFi 중 하나인 클레이스왑(KLAYswap)에 대한 공격은 BGP 하이재킹 이용

8. 공격 대상을 정부로 넓혀가는 러시아 사이버범죄 집단 - Conti, Lockbit2.0, Killnet

취약점 동향

1. 오픈소스 보안 라이브러리 잠재적 위협 - OpenSSL 취약점

  • 2014년 4월 OpenSSL 라이브러리에 HeartBleed 취약점 발견
  • 2022년 3월 OpenSSL 내 BN_mod_sqrt() 함수에서 연산시 무한루프가 발생하는 서비스 거부 취약점(CVE-2022-0778) 발견
  • 2022년 5월 OpenSSL 내 명령 주입 취약점(CVE-2022-1292), 인증 오류 취약점(CVE-2022-1343), 비밀번호 오류 취약점(CVE-2022-1434), 서비스 거부 취약점(CVE-2022-1473) 발표

2. 방심이 불러온 취약점의 부활 - 사파리 취약점

  • 특정 버전 이하의 소프트웨어를 사용하는 이용자 단말에서 악의적으로 제작된 웹 컨텐츠를 처리하면 임의의 코드를 실행할 수 있으며, 권한을 탈취하고 정보를 유출할 수 있음
  • 대응방법: Zero-day 공격에 노출되어 있어, 보안패치 및 업데이트 발표시 최신 버전으로 적용

* macOS Monterey 12.2.1, iOS 15.3.1 and iPadOS 15.3.1, Safari 15.3(v. 16612.4.9.1.8 and 15612.4.9.1.8)

3. 협업의 도구의 숨은 위협 - 아틀라시안 컨플루언스 취약점

  • End-Point에 사용자가 계정을 만들어 가입하도록 허용되어 있는 경우 관리자가 아닌 사용자 또는 인증되지 않은 사용자가 컨플루언스 또는 데이터센터 인스턴스에서 html 필드를 대상으로 임의의 코드 실행을 통해 원격 명령어의 실행을 통한 이용자에 대한 2차 공격 및 등록된 자료의 유출이 가능함
  • 공격자가 제공한 URI가 네임스페이스로 변환되어 OGNL 표현식 평가로 이어져 공격자가 임의의 명령어를
    수행할 수 있음

* Atlassian: 소프트웨어 개발 및 협업 도구

 

[참고] Log4j 위협 대응 보고서 v1.0

21년 12월, 全 세계를 공포로 몰아넣을 만한 심각한 취약점 공격 기법이 Github에 공개되었다. 당시 공개된 공격
기법은 Log4j라는 오픈소스 프로그램이 가지고 있는 취약점을 악용하는 것이었다.

 

 

728x90
728x90
728x90
반응형

[Review] (4주차) 실습

2022.07.10 - [Dev/Swift] - [Xcode] iOS Swift 앱 개발 Byte Degree - week.04

 

[Xcode] iOS Swift 앱 개발 Byte Degree - week.04

[Review] (3주차) 실습 2022.07.01 - [Swift] - [Xcode] iOS Swift 앱 개발 Byte Degree - week.03 [Xcode] iOS Swift 앱 개발 Byte Degree - week.03 [Review] (2주차) 실습 2022.06.26 - [Swift] - [Xcode] iOS..

sarahee.tistory.com


애플 프레임워크 모달 - 상세뷰로 진입하거나, 새로운 뷰 띄워보기

// 위임 self
override func viewOldLoad() {
	collectionView.delegate = self
}

extension FrameworkListViewController: UICollectionViewDelegate {
	func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    	let framework = list[indexPath.item]
        print(">>> selected: \(framework.name)")
        
        // FrameworkDetailViewController 띄우고자 함
        let storyboard = UIStoryboard(name: "Detail", bundle: nil)
        let vc = storyboard.instantiateViewController(withIdentifier: "FrameworkDetailViewController")
        	as! FrameworkDetailViewController
        vc.framework = framework
        present(vc, animated: true)
    }
}

멀티라인으로 설정하기 위해서는..

Label의 Lines: 1 → 0

 

Combine Overview

주요 컴포넌트 3가지

Publisher: 생산자, 크리에이터

Subscriber: 소비자, 구독자

Operator: 변경시키는 사람, 가공하는 사람

-

실습

Class: QuickFocusListViewController, Subclass of: UIViewController 추가

Class: QuickFocusCell, Subclass of: UICollectionViewCell 추가

//
//  QuickFocusListViewController.swift
//  HeadSpaceFocus
//
//  Created by sehee on 2022/07/21.
//

import UIKit

class QuickFocusListViewController: UIViewController {
    
    @IBOutlet weak var collectionView: UICollectionView!
    
    let breathingList = QuickFocus.breathing
    let walkingList = QuickFocus.walking
    
    enum Section: CaseIterable {
        case breathe
        case walking
        
        var title: String {
            switch self {
            case .breathe: return "Breathing exercises"
            case .walking: return "Mindful walks"
            }
        }
    }
    
    typealias Item = QuickFocus
    var datasource: UICollectionViewDiffableDataSource<Section, Item>!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // enum Section CaseIterable 생성한 코드가 다음 내용과 동일
//        Section.allCases
//        let allItems: [Section] = [.breathe, .walking]
        // 생성 코드가 다음과 같이 쓰일 수 있음
//        let section: Section = .breathe
//        section.title
        
        // Presentation
        datasource = UICollectionViewDiffableDataSource<Section, Item>(collectionView: collectionView, cellProvider: { collectionView, indexPath, item in
            guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "QuickFocusCell", for: indexPath) as? QuickFocusCell else {
                return nil
            }
            cell.configure(item)
            return cell
        })
        
        // Data
        var snapshot = NSDiffableDataSourceSnapshot<Section, Item>()
        snapshot.appendSections([.breathe, .walking])
        // 위의 코드와 동일
//        snapshot.appendSections(Section.allCases)
        snapshot.appendItems(breathingList, toSection: .breathe)
        snapshot.appendItems(walkingList, toSection: .walking)
        datasource.apply(snapshot)
        
        // Layout
        collectionView.collectionViewLayout = layout()
    }
    private func layout() -> UICollectionViewCompositionalLayout {
        let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(0.5), heightDimension: .estimated(50))
        let item = NSCollectionLayoutItem(layoutSize: itemSize)
        
        let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .estimated(50))
        let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitem: item, count: 2)
        
        let section = NSCollectionLayoutSection(group: group)
        
        let layout = UICollectionViewCompositionalLayout(section: section)
        return layout
    }
}

코드를 연결하기 위해, FocusViewController의 Layout에 다음 코드 추가

collectionView.delegate = self

하단 코드 연결

extension FocusViewController: UICollectionViewDelegate {
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        let item = items[indexPath.item]
        print(">>> \(item.title)")
        
        let storyboard = UIStoryboard(name: "QuickFocus", bundle: nil)
        let vc = storyboard.instantiateViewController(withIdentifier: "QuickFocusListViewController") as! QuickFocusListViewController
        present(vc, animated: true)
    }
}

좌우 padding

1) section.contentInsets

2) section.interGroupSpacing, group.interItemSpacing

private func layout() -> UICollectionViewCompositionalLayout {
        let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(0.5), heightDimension: .estimated(50))
        let item = NSCollectionLayoutItem(layoutSize: itemSize)
        
        let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .estimated(50))
        let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitem: item, count: 2)
        group.interItemSpacing = .fixed(10)
        
        let section = NSCollectionLayoutSection(group: group)
        section.contentInsets = NSDirectionalEdgeInsets(top: 30, leading: 20, bottom: 30, trailing: 20)
        section.interGroupSpacing = 20
        
        let layout = UICollectionViewCompositionalLayout(section: section)
        return layout
    }

헤더 추가

+ > Collection Reusable View

해당 View의 custom class 생성 - Class: QuickFocusListHeaderView, Subclass of: UICollectionReusableView 추가

//
//  QuickFocusHeaderView.swift
//  HeadSpaceFocus
//
//  Created by sehee on 2022/07/22.
//

import UIKit

class QuickFocusHeaderView: UICollectionReusableView {
    @IBOutlet weak var titleLabel: UILabel!
    
    func configure(_ title: String) {
        titleLabel.text = title
    }
}

QuickFocusListViewController 코드 삽입

datasource.supplementaryViewProvider = { (collectionView, kind, indexPath) in
            guard let header = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "QuickFocusHeaderView", for: indexPath) as? QuickFocusHeaderView else {
                return nil
            }
            let allSections = Section.allCases
            let section = allSections[indexPath.section]
            header.configure(section.title)
            return header
        }

QuickFocusListViewController 하단 UICollectionViewCompositionalLayout

let headerSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .absolute(50))
        let header = NSCollectionLayoutBoundarySupplementaryItem(layoutSize: headerSize, elementKind: UICollectionView.elementKindSectionHeader, alignment: .top)
        section.boundarySupplementaryItems = [header]

Focus View Controller UI 클릭 후, Editor > Embed in > Navigation Controller

FocusViewController의 UICollectionViewDelegate

// 기존
		present(vc, animated: true)
// 변경: Navigation - Back
		navigationController?.pushViewController(vc, animated: true)

Navigation Bar의 ☑ Prefers Large Titles, Title 이름은 Focus로 설정

FocusViewController의 UICollectionViewDelegate 코드 추가

vc.title = item.title

QuickFocusListViewController의 Layout 코드 추가

self.navigationItem.largeTitleDisplayMode = .never

Navigation Bar의 Tint color: Default에서 White Color로 변경

최종 코드

//
//  QuickFocusListViewController.swift
//  HeadSpaceFocus
//
//  Created by sehee on 2022/07/21.
//

import UIKit

class QuickFocusListViewController: UIViewController {
    
    @IBOutlet weak var collectionView: UICollectionView!
    
    let breathingList = QuickFocus.breathing
    let walkingList = QuickFocus.walking
    
    enum Section: CaseIterable {
        case breathe
        case walking
        
        var title: String {
            switch self {
            case .breathe: return "Breathing exercises"
            case .walking: return "Mindful walks"
            }
        }
    }
    
    typealias Item = QuickFocus
    var datasource: UICollectionViewDiffableDataSource<Section, Item>!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // enum Section CaseIterable 생성한 코드가 다음 내용과 동일
//        Section.allCases
//        let allItems: [Section] = [.breathe, .walking]
        // 생성 코드가 다음과 같이 쓰일 수 있음
//        let section: Section = .breathe
//        section.title
        
        // Presentation
        datasource = UICollectionViewDiffableDataSource<Section, Item>(collectionView: collectionView, cellProvider: { collectionView, indexPath, item in
            guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "QuickFocusCell", for: indexPath) as? QuickFocusCell else {
                return nil
            }
            cell.configure(item)
            return cell
        })
        
        datasource.supplementaryViewProvider = { (collectionView, kind, indexPath) in
            guard let header = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "QuickFocusHeaderView", for: indexPath) as? QuickFocusHeaderView else {
                return nil
            }
            let allSections = Section.allCases
            let section = allSections[indexPath.section]
            header.configure(section.title)
            return header
        }
        
        // Data
        var snapshot = NSDiffableDataSourceSnapshot<Section, Item>()
        snapshot.appendSections([.breathe, .walking])
        // 위의 코드와 동일
//        snapshot.appendSections(Section.allCases)
        snapshot.appendItems(breathingList, toSection: .breathe)
        snapshot.appendItems(walkingList, toSection: .walking)
        datasource.apply(snapshot)
        
        // Layout
        collectionView.collectionViewLayout = layout()
        self.navigationItem.largeTitleDisplayMode = .never
    }
    private func layout() -> UICollectionViewCompositionalLayout {
        let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(0.5), heightDimension: .estimated(50))
        let item = NSCollectionLayoutItem(layoutSize: itemSize)
        
        let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .estimated(50))
        let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitem: item, count: 2)
        group.interItemSpacing = .fixed(10)
        
        let section = NSCollectionLayoutSection(group: group)
        section.contentInsets = NSDirectionalEdgeInsets(top: 30, leading: 20, bottom: 30, trailing: 20)
        section.interGroupSpacing = 20
        
        let headerSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .absolute(50))
        let header = NSCollectionLayoutBoundarySupplementaryItem(layoutSize: headerSize, elementKind: UICollectionView.elementKindSectionHeader, alignment: .top)
        section.boundarySupplementaryItems = [header]
        
        let layout = UICollectionViewCompositionalLayout(section: section)
        return layout
    }
}
//
//  QuickFocusCell.swift
//  HeadSpaceFocus
//
//  Created by sehee on 2022/07/21.
//

import UIKit

class QuickFocusCell: UICollectionViewCell {
    @IBOutlet weak var thumbnailImageView: UIImageView!
    @IBOutlet weak var titleLabel: UILabel!
    @IBOutlet weak var descriptionLabel: UILabel!
    
    func configure(_ quickFocus: QuickFocus) {
        thumbnailImageView.image = UIImage(named: quickFocus.imageName)
        titleLabel.text = quickFocus.title
        descriptionLabel.text = quickFocus.description
    }
}
//
//  FocusViewController.swift
//  HeadSpaceFocus
//
//  Created by sehee on 2022/07/10.
//

import UIKit

class FocusViewController: UIViewController {
    
    @IBOutlet weak var collectionView: UICollectionView!
    @IBOutlet weak var refreshButton: UIButton!
    
    var curated: Bool = false
    var items: [Focus] = Focus.list
    
    typealias Item = Focus
    enum Section {
        case main
    }
    var datasource: UICollectionViewDiffableDataSource<Section, Item>!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        refreshButton.layer.cornerRadius = 10
        
        // Presentation: Diffable Datasource + Cell Provider
        datasource = UICollectionViewDiffableDataSource<Section, Item>(collectionView: collectionView, cellProvider: { collectionView, indexPath, item in
            guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "FocusCell", for: indexPath) as? FocusCell else {
                return nil
            }
            cell.configure(item)
            return cell
        })
        
        // Data: Snapshot
        var snapshot = NSDiffableDataSourceSnapshot<Section, Item>()
        snapshot.appendSections([.main])
        snapshot.appendItems(items, toSection: .main)
        datasource.apply(snapshot)
        
        // Layout
        collectionView.collectionViewLayout = layout()
        collectionView.delegate = self
        
        updateButtonTitle()
    }
    
    private func layout() -> UICollectionViewCompositionalLayout {
        
        let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .estimated(50))
        let item = NSCollectionLayoutItem(layoutSize: itemSize)
        
        let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .estimated(50))
        let group = NSCollectionLayoutGroup.vertical(layoutSize: groupSize, subitems: [item])
        
        let section = NSCollectionLayoutSection(group: group)
        section.contentInsets = NSDirectionalEdgeInsets(top: 10, leading: 20, bottom: 10, trailing: 20)
        section.interGroupSpacing = 10
        
        let layout = UICollectionViewCompositionalLayout(section: section)
        return layout
    }
    
    func updateButtonTitle() {
        let title = curated ? "See All" : "See Recommendation"
        refreshButton.setTitle(title, for: .normal)
    }
    
    @IBAction func refreshButtonTapped(_ sender: Any) {
        curated.toggle()
        
        self.items = curated ? Focus.recommendations : Focus.list
        
        var snapshot = NSDiffableDataSourceSnapshot<Section, Item>()
        snapshot.appendSections([.main])
        snapshot.appendItems(items, toSection: .main)
        datasource.apply(snapshot)
        
        updateButtonTitle()
    }
}

extension FocusViewController: UICollectionViewDelegate {
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        let item = items[indexPath.item]
        print(">>> \(item.title)")
        
        let storyboard = UIStoryboard(name: "QuickFocus", bundle: nil)
        let vc = storyboard.instantiateViewController(withIdentifier: "QuickFocusListViewController") as! QuickFocusListViewController
        vc.title = item.title
//        present(vc, animated: true)
        navigationController?.pushViewController(vc, animated: true)
    }
}

[Next] (6주차) 실습

2022.07.22 - [Development/Swift] - [Swift] iOS 앱 개발(Xcode) Byte Degree - week.06

 

[Swift] iOS 앱 개발(Xcode) Byte Degree - week.06

[Review] (5주차) 실습 2022.07.16 - [Dev/Swift] - [Xcode] iOS Swift 앱 개발 Byte Degree - week.05 [Xcode] iOS Swift 앱 개발 Byte Degree - week.05 [Review] (4주차) 실습 2022.07.10 - [Dev/Swift] - [Xco..

sarahee.tistory.com

 

728x90
728x90
728x90
반응형

yum: Yellowdog Updater Modified, rpm 기반의 시스템을 위한 자동 업데이트 및 패키지 설치/삭제 도구

Command 'yum' not found, did you mean: /&nbsp;See 'snap info <snapname>' for additional versions.

root@ubuntu:/home/sehee# yum help

Command 'yum' not found, did you mean:

  command 'gum' from snap gum (0.12.0)
  command 'sum' from deb coreutils (8.30-3ubuntu2)
  command 'zum' from deb perforate (1.2-5.1)
  command 'uum' from deb freewnn-jserver (1.1.1~a021+cvs20130302-7build1)
  command 'num' from deb quickcal (2.4-1)

See 'snap info <snapname>' for additional versions.

ubuntu nginx에 yum 설치가 되어 있지 않기 때문에 생긴 오류

E: Unable to locate package yum

root@ubuntu:/etc/apt# sudo apt-get install yum

Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package yum

ubuntu에서 package를 다운로드하는 홈페이지 주소가 추가되지 않음

(/etc/apt 폴더 내)

sudo cp source.list source.list.backup

sudo 명령어를 통하여 /etc/apt/source.list 수정

sudo vi sources.list

default sources.list code

sources.list 파일 내 us 삭제

http://us.archive.ubuntu.com/ubuntu http://archive.ubuntu.com/ubuntu

 

하단에 다음 url 입력(package를 설치하는)

deb http://archive.ubuntu.com/ubuntu bionic main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu bionic-security main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu bionic-updates main restricted universe multiverse

업데이트 후 확인

sudo apt-get update

root@ubuntu:/etc/apt# sudo apt-get install yum

E: Could not get lock /var/lib/dpkg/lock-frontend. It is held by process 5628 (unattended-upgr)
N: Be aware that removing the lock file is not a solution and may break your system.
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?
sudo killall apt apt-get

# 진행 중인 파일이 없다면
sudo rm /var/lib/apt/lists/lock
sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock*

sudo dpkg --configure -a

command 순서대로 설치하여 해결

apt-get install python-lzma python-sqlitecachec python-pycurl python-urlgrabber

 

728x90
728x90

'Development > error' 카테고리의 다른 글

[Error] bash 오류_No such file or directory  (0) 2022.08.03
728x90
반응형
목차
1. 허준이 교수, 필즈상(Fields Medal) 수상 (220705)

2. 2022년 공개소프트웨어 개발자대회 참가자 모집 (220704)
3. 과기정통부, 7월 한 달간 제11회 정보보호의 달 운영 (220704)
4. 1차관, 주요 공공기관 사이버보안 대응태세 점검 (220701)
5. [2022년 6월] 인터넷·정보보호 법제동향 제177호 (220707)
6. 과학기술&ICT 정책·기술 동향 217호 (220701)

1. 허준이 교수, 필즈상(Fields Medal) 수상 (220705)

(출처: 과학기술정보통신부, 보도자료, 미래인재정책국 미래인재양성과 강호원 과장(044-202-4830), 이현우 사무관(044-202-4832))

  • '22년 세계수학자대회(International Congress of Mathematicians, ICM)에서 수학계에 중요한 공헌을 한 40세 미만의 수학자에게 수여하는 ‘필즈상 (Fields Medal)을 허준이 교수(美 프린스턴대 및 韓 고등과학원)가 수상
  • 허교수는 조합 대수기하학을 통해 조합론의 난제를 해결하고 대수기하학의 토대가 더욱 확장되도록 새 지평을 연 공로를 인정받아, 한국계 최초로 필즈상 수상의 쾌거를 이룩

허교수의 연구분야

조합 대수기하학(combinatorial algebraic geometry)

  • 대수기하학(algebraic geometry)*을 통해 조합론(combinatorics)**의 문제를 해결하는 비교적 새로운 분야

* 대수기하학: 1·2차 다항식으로 직선·평면·타원·쌍곡선을 표현·분석하는 것처럼 대수학으로 기하를 연구하는 학문

** 조합론: 유한·가산적 대상들에 대하여, 주어진 성질을 만족시키거나 극대화하는 것을 연구하는 학문

 

해결한 다수의 난제(conjecture)

리드 추측

  • 여러 개의 꼭짓점들을 선분으로 연결하고, 연결된 점들까지는 다른 색으로 칠하는 경우의 수를 사용된 색의 개수에 관한 함수로 표현할 때, 함수는 다항식이 되는데 그 다항식의 계수들의 커지고 작아지는 경향을 추측

국제수학연맹(IMU)에서 한국의 수학 국가등급을 최고등급으로 상향

  • ‘22. 2월 한국의 수학 국가등급을 최고등급(4그룹 → 5그룹)으로 상향
  • '81년 1그룹 국가로 IMU 가입 이후, 회원국 중 최단기간 內 최고등급(5그룹)으로 상향

- (現 5그룹) 한국, 독일, 러시아, 미국, 브라질, 영국, 이스라엘, 이탈리아, 일본, 중국, 캐나다, 프랑스


2. 2022년 공개소프트웨어 개발자대회 참가자 모집 (220704)

(출처: 과학기술정보통신부, 보도자료, 소프트웨어정책관 소프트웨어산업과 조민영 과장(010-3188-9598), 손진철 사무관(044-202-6331))

  • 총 상금 6,600만원, 과기정통부장관상 등 총 23점 시상
  • 공개소프트웨어 개발 역량 향상 및 온라인 교육, 멘토링 기회 제공
  • 참가 접수: 2022년 7월 4일(월) - 8월 3일(수), 출품작 접수: 2022년 9월 15일(목)

* 대회 문의

1) '2022년 공개소프트웨어 개발자대회' 운영 사무국(02-599-7917/contest@oss.kr)

2) 카카오톡 '공개소프트웨어 개발자대회' 채널


3. 과기정통부, 7월 한 달간 제11회 정보보호의 달 운영 (220704)

(출처: 과학기술정보통신부, 보도자료, 과학기술정보통신부 정보보호기획과)

  • '튼튼한 사이버안보, 안전한 디지털강국'을 주제로 7월 한 달 동안 제11회 정보보호의 달 운영
  • 정보보호의 날 기념행사: 기념식, 정보보호 국제 컨퍼런스, 정보보호 제품 전시회
  • 정보보호의 달 연계행사: 정보보호 인력양성 간담회, 지역 정보보호 생태계 조성 간담회, 융합산업XSecurity 밋업데이, 메타버스·대체불가토큰(NFT) 보안 협의체 발대식 등(정보보호의 달 기념 누리집(www.secuday.kr)에서 확인 가능)
  • 국민과 함께하는 7월: 국민 참여 이벤트, 정보보호 실천 교육

4. 1차관, 주요 공공기관 사이버보안 대응태세 점검 (220701)

(출처: 산업통상자원부, 보도자료, 정보보호담당관 박지운 과장(044-203-5590))

  • 최근 세계적으로 러시아-우크라이나 전쟁의 여파가 사이버영역까지 확대되고, 특정 대상을 목표로 한 랜섬웨어(Ransomware) 공격*과 소프트웨어 취약점**을 이용하여 불특정 다수를 공격하는 사례가 빈번해지는 등 사이버위협이 증대되고 있음

* 랜섬웨어 공격: 컴퓨터 내 파일을 암호화한 후 금전을 요구하는 형태로 ‘21. 5월 美 송유관 기업(콜로니얼 파이프라인)을 대상으로 송유관 제어설비를 마비시켜 6일간 美 동남부 휘발유 공급이 중단된 사례가 있음

** 제로데이 공격: 소프트웨어 취약점이 발견된 후 보안업데이트가 배포되기 전까지 해당 소프트웨어가 적용된 서버, PC 등을 집중적으로 공격하는 형태로 ‘21. 12월 로그 관리용 소프트웨어인 Log4j의 취약점 공격이 대표 사례

  • 올해 3월 21일 공공기관 사이버위기경보 단계가 관심에서 주의로 격상, 산업부는 사이버안전 위기대응 매뉴얼에 따라 보안관제를 강화하고 긴급대응반을 운영해 오고 있음

* 사이버위기경보 발령단계: 정상 → 관심 → 주의 → 경계 → 심각


5. [2022년 6월] 인터넷·정보보호 법제동향 제177호 (220707)

(출처: 한국인터넷진흥원, 인터넷·정보보호 법제동향, 법제연구팀 김홍빈(061-820-1704))

 국내 입법 동향 <공포된 법령> 

  • 「정보통신망 이용촉진 및 정보보호 등에 관한 법률」 일부개정법률 공포 (2022. 6. 10.)
  • 「정보통신기반 보호법」 일부개정법률 공포 (2022. 6. 10.)
  • 「전기통신사업법」 일부개정법률 공포 (2022. 6. 10.)
  • 「산업재해보상보험법」 일부개정법률 공포 (2022. 6. 10.)
  • 「이러닝(전자학습)산업 발전 및 이러닝 활용 촉진에 관한 법률」 일부개정법률 공포 (2022. 6. 10.)

6. 과학기술&ICT 정책·기술 동향 217호 (220701)

(출처: 과학기술정보통신부 · 한국과학기술기획평가원(KISTEP), S&T GPS)

  • EU와 유럽 주요국 연구개발시스템 동향
  • 주요 동향: 과학기술

미국, 핵융합 에너지 기술개발과 상업화 병행 방안

  • 백악관 과학기술정책실(OSTP)은 핵융합 에너지 기술의 개발과 상업화를 병행하여 추진하는 방안 발표*('22.6)

* Parallel Processing the Path to Commercialization of Fusion Energy

미국, 스테이블코인의 법적 이슈와 규제적 대응 방안

  • 미국 의회조사국(CRS)은 스테이블코인 기술과 관련한 미국 내 법적 이슈와 정부와 의회의 규제적 대응 방안 발표*('22.6)
  • 스테이블코인(Stablecoins) 기술은 가격 변동성이 너무 크다는 암호화폐의 한계를 극복하고자 개발
  • 암호화폐는 일반적인 화폐로의 기능에는 한계(∵ 가격 변동성) 법정화폐나 자산을 담보로 발행되거나 알고리즘을 바탕으로 가치를 일정하게 유지하도록 설계

* Stablecoins: Legal Issues and Regulatory Options

미국, 국가별 첨단 산업의 경쟁력 평가 발표

  • 정보기술혁신재단(ITIF)은 국가・지역별 첨단 산업의 경쟁력 분석 결과를 바탕으로 미국의 산업 경쟁력 강화 방안 보고서* 발표(’22.6)

* The Hamilton Index: Assessing National Performance in the Competition for Advanced Industries

 

 

728x90
728x90
728x90
반응형
목차
1. print()
2. 기본 자료형: 숫자형, 문자열, 리스트
3. 변수
4. 연산: 사칙연산, 특수연산, 문자열 연산
5. 인덱싱과 슬라이싱

1. print()

Point I
print() : 문자열을 출력하는 명령어

print("Hello Rabbit!")  

## 출력결과 ##
Hello Rabbit!

Point II
콤마(,)를 통해 여러 자료를 출력

print(3, "Hello")   

## 출력결과 ##
3 Hello

Point III
print()를 여러 번 사용하여 여러 줄에 걸쳐 출력

print(3)  
print(6)  
print(9)  

## 출력결과 ##
3
6
9

2. 기본 자료형

Point I
숫자형 : 숫자로 이루어진 자료형

3 : 정수  
3.14 : 실수  

Point II
문자열 : 문자, 혹은 문자들의 집합 - 큰따옴표(“)/작은따옴표(‘)로 구분

'Hello'  
'3.14'  
"3.14"  

Point III
리스트 : 여러 자료를 함께 보관하는 자료형 - 대괄호([])로 구분

[]  
['a', 'b']  
['a', 2]  

3. 변수

Point I
변수 : 자료를 담는 그릇
변수 이름 = 자료 형태로 사용

num = 10   
name = "Michael"   
grade = ['A+', 'B+', 'A0']  

Point II
변수 이름 짓기
숫자, 알파벳, 언더바(_) 등을 사용

Point III
금지 규칙

  • 숫자로 시작하는 변수이름 금지
1st = 1000 #Error
  • 숫자로만 구성된 변수 이름은 사용 불가
123 = "Hello!" #Error
  • 파이썬 문법에서 이미 사용되는 단어(keyword, 예약어)는 사용 불가
for = 10 #Error
  • 공백 문자( )와 연산자는 사용 불가
I am = "groot" #Error  
3+4 = 12 #Error

4. 연산

Point I
숫자의 사칙연산 : +(더하기), -(빼기), *(곱하기), /(나누기)

print(6+3) #9
print(6-3) #3
print(6*3) #18
print(6/3) #2.0

Point II
숫자의 특수연산 : **(제곱), //(몫 연산), %(나머지 연산)

print(6**3) #216
print(6//3) #2
print(6%3) #0

Point III
문자열의 연산: +(연결하기), *(반복하기)

print("Hello" + "World") #HelloWorld
print("Hello"*3) #HelloHelloHello

5. 인덱싱과 슬라이싱

Point I
인덱스 : 문자열과 리스트의 특정 원소의 위치, 0부터 시작

"Hello"에서 H = Index 0, e = index 1, ...

Point II
인덱싱 : 문자열과 리스트의 특정 위치(인덱스)의 원소를 가져오는 것

greet = "Hello!"  
print(greet[1])  

## 출력결과 ##
e

Point III
슬라이싱 : 문자열과 리스트의 특정 부분을 가져오는 것

greet = "Hello!"  
print(greet[0:5])  
Hello

[Next] (2주차) 조건문

2022.05.25 - [Dev/Python] - [Python] 02 조건문 - week.02

 

[Python] 02 조건문 - week.02

목차 1. 입력 1) 변수 2) 형 변환 2. 논리 자료형(Boolean Data) 1) 논리 자료형 2) 비교 연산자 3) 논리 연산자 3. 조건문 1) if문 2) elif문 3) else문 [Review] (1주차) 기초 자료형 2022.07.10 - [Dev/Python]..

sarahee.tistory.com

 

728x90
728x90

'Development > Python' 카테고리의 다른 글

[Python] 02 함수와 메서드 - week.06  (0) 2022.11.08
[Python] 01 기초 자료형 II - week.05  (0) 2022.09.05
[Python] 04 반복문 - week.04  (0) 2022.08.08
[Python] 03 리스트 - week.03  (0) 2022.07.28
[Python] 02 조건문 - week.02  (0) 2022.07.22
728x90
반응형

[Review] (3주차) 실습

2022.07.01 - [Swift] - [Xcode] iOS Swift 앱 개발 Byte Degree - week.03

 

[Xcode] iOS Swift 앱 개발 Byte Degree - week.03

[Review] (2주차) 실습 2022.06.26 - [Swift] - [Xcode] iOS Swift 앱 개발 Byte Degree - week.02 [Xcode] iOS Swift 앱 개발 Byte Degree - week.02 iOS 아키텍처 패턴 중 애플에서는 기본적으로 MVC 패턴을 가..

sarahee.tistory.com


다크모드 변경

command + shift + a (toggle)



주석 달기

command + /

 

내비게이션 컨트롤러 설정

Editor > Embed in > Navigation Controller

Prefers Large Titles 체크

 

Safe Area 설정

Vertical에서

Align Bottom to: Safe Area / Align Top to: Safe Area 더블클릭

Fitst Item: Safe Area Bottom -> Superview, 다시 이전 Edit -> Constant: 0 설정

 

좌우측 여백(padding)

override func viewDidLead() { 내에

collectionView.contentInset = UIEdgeInsets(top: 20, left: 30, bottom: 0, right: 30)


탭바 컨트롤러의 주요 뷰

[Documentation] UITabBarController

https://developer.apple.com/documentation/uikit/uitabbarcontroller

 

File > New > File (or command + N) > Cocoa Touch Class > Class: FocusViewController, Subclass of: UIViewController

Main > Focus View Controller의 Class와 Storyboard ID에 FocusViewController 입력

 

UI의 Collection View 설정, 셀 디자인 및 오토레이아웃 설정

//
//  FocusViewController.swift
//  HeadSpaceFocus
//
//  Created by sehee on 2022/07/10.
//

import UIKit

class FocusViewController: UIViewController {
    @IBOutlet weak var collectionView: UICollectionView!
    var items: [Focus] = Focus.list
    typealias Item = Focus
    enum Section {
        case main
    }
    var datasource: UICollectionViewDiffableDataSource<Section, Item>!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Presentation, Data, Layout
        datasource = UICollectionViewDiffableDataSource<Section, Item>(collectionView: collectionView, cellProvider: { collectionView, indexPath, item in
            
            guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "FocusCell", for: indexPath) as? FocusCell else {
                return nil
            }
            cell.configure(item)
            return cell
        })
        // data: Snapshot
        var snapshot = NSDiffableDataSourceSnapshot<Section, Item>()
        snapshot.appendSections([.main])
        snapshot.appendItems(items, toSection: .main)
        datasource.apply(snapshot)
        collectionView.collectionViewLayout = layout()
    }
    private func layout() -> UICollectionViewCompositionalLayout {
        let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .estimated(50))
        let item = NSCollectionLayoutItem(layoutSize: itemSize)
        let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .estimated(50))
        let group = NSCollectionLayoutGroup.vertical(layoutSize: groupSize, subitems: [item])
        let section = NSCollectionLayoutSection(group: group)
        let layout = UICollectionViewCompositionalLayout(section: section)
        return layout
    }
}
//
//  FocusCell.swift
//  HeadSpaceFocus
//
//  Created by sehee on 2022/07/10.
//

import UIKit

class FocusCell: UICollectionViewCell {
    
    @IBOutlet weak var titleLabel: UILabel!
    @IBOutlet weak var descriptionLabel: UILabel!
    @IBOutlet weak var thumbnailImageView: UIImageView!
    
    func configure(_ item: Focus) {
        titleLabel.text = item.title
        descriptionLabel.text = item.description
        thumbnailImageView.image = UIImage(systemName: item.imageName)?.withRenderingMode(.alwaysOriginal)
    }
}

FocusCell 코드 추가

override func awakeFromNib() {
        super.awakeFromNib()
        contentView.backgroundColor = UIColor.systemIndigo
        contentView.layer.cornerRadius = 10
    }

FocusViewController 코드 추가

let section = NSCollectionLayoutSection(group: group)
        section.contentInsets = NSDirectionalEdgeInsets(top: 10, leading: 20, bottom: 10, trailing: 20)
        section.interGroupSpacing = 10

FocusViewController 코드 추가

// 1
@IBOutlet weak var refreshButton: UIButton!
    var curated: Bool = false

// 2
let title = curated ? "See All" : "See Recommendation"
        refreshButton.setTitle(title, for: .normal)
    
// 3
@IBAction func refreshButtonTapped(_ sender: Any) {
        curated.toggle()
        self.items = curated ? Focus.recommendations : Focus.list
        
        var snapshot = NSDiffableDataSourceSnapshot<Section, Item>()
        snapshot.appendSections([.main])
        snapshot.appendItems(items, toSection: .main)
        datasource.apply(snapshot)
        
        let title = curated ? "See All" : "See Recommendation"
        refreshButton.setTitle(title, for: .normal)
    }

DRY 원칙(Do not Repeat Yourself)

updateButtonTitle() 함수 생성하여 중복 코드 제거

func updateButtonTitle() {
        let title = curated ? "See All" : "See Recommendation"
        refreshButton.setTitle(title, for: .normal)
    }

버튼 둥글게 설정

refreshButton.layer.cornerRadius = 10

전체 코드

//
//  FocusViewController.swift
//  HeadSpaceFocus
//
//  Created by sehee on 2022/07/10.
//

import UIKit

class FocusViewController: UIViewController {
    @IBOutlet weak var collectionView: UICollectionView!
    
    @IBOutlet weak var refreshButton: UIButton!
    
    var curated: Bool = false
    var items: [Focus] = Focus.list
    
    typealias Item = Focus
    enum Section {
        case main
    }
    
    var datasource: UICollectionViewDiffableDataSource<Section, Item>!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        refreshButton.layer.cornerRadius = 10
        
        // Presentation, Data, Layout
        datasource = UICollectionViewDiffableDataSource<Section, Item>(collectionView: collectionView, cellProvider: { collectionView, indexPath, item in
            
            guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "FocusCell", for: indexPath) as? FocusCell else {
                return nil
            }
//            let data = self.items[indexPath.item]
//            cell.configure(data)
            cell.configure(item)
            return cell
        })
        // data: Snapshot
        var snapshot = NSDiffableDataSourceSnapshot<Section, Item>()
        snapshot.appendSections([.main])
        snapshot.appendItems(items, toSection: .main)
        datasource.apply(snapshot)
        collectionView.collectionViewLayout = layout()
        
        updateButtonTitle()
    }
    private func layout() -> UICollectionViewCompositionalLayout {
        let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .estimated(50))
        let item = NSCollectionLayoutItem(layoutSize: itemSize)
        
        let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .estimated(50))
        let group = NSCollectionLayoutGroup.vertical(layoutSize: groupSize, subitems: [item])
        
        let section = NSCollectionLayoutSection(group: group)
        section.contentInsets = NSDirectionalEdgeInsets(top: 10, leading: 20, bottom: 10, trailing: 20)
        section.interGroupSpacing = 10
        
        let layout = UICollectionViewCompositionalLayout(section: section)
        return layout
    }
    
    func updateButtonTitle() {
        let title = curated ? "See All" : "See Recommendation"
        refreshButton.setTitle(title, for: .normal)
    }
    
    @IBAction func refreshButtonTapped(_ sender: Any) {
        curated.toggle()
        self.items = curated ? Focus.recommendations : Focus.list
        
        var snapshot = NSDiffableDataSourceSnapshot<Section, Item>()
        snapshot.appendSections([.main])
        snapshot.appendItems(items, toSection: .main)
        datasource.apply(snapshot)
        
        updateButtonTitle()
    }
}
//
//  FocusCell.swift
//  HeadSpaceFocus
//
//  Created by sehee on 2022/07/10.
//

import UIKit

class FocusCell: UICollectionViewCell {
    
    @IBOutlet weak var titleLabel: UILabel!
    @IBOutlet weak var descriptionLabel: UILabel!
    @IBOutlet weak var thumbnailImageView: UIImageView!
    
    override func awakeFromNib() {
        super.awakeFromNib()
        contentView.backgroundColor = UIColor.systemIndigo
        contentView.layer.cornerRadius = 10
    }
    
    func configure(_ item: Focus) {
        titleLabel.text = item.title
        descriptionLabel.text = item.description
        thumbnailImageView.image = UIImage(systemName: item.imageName)?.withRenderingMode(.alwaysOriginal)
    }
}

[Next] (5주차) 실습

2022.07.16 - [Dev/Swift] - [Xcode] iOS Swift 앱 개발 Byte Degree - week.05

 

[Xcode] iOS Swift 앱 개발 Byte Degree - week.05

[Review] (4주차) 실습 2022.07.10 - [Dev/Swift] - [Xcode] iOS Swift 앱 개발 Byte Degree - week.04 [Xcode] iOS Swift 앱 개발 Byte Degree - week.04 [Review] (3주차) 실습 2022.07.01 - [Swift] - [Xcode]..

sarahee.tistory.com

 

728x90
728x90
728x90
반응형
개요
* Easy_CrackMe.exe 실습 리뷰 및 Easy_KeygenMe.exe 파일 실습
1. 디스어셈블리 상세 기능
- 스택 프레임 및 함수 호출 규약의 이해
- 동적 디버깅 사용 및 코드 실행
- 데이터 타입과 데이터 구조
- 기본 데이터/코드 변환
2. 스택/힙 할당 배열 및 구조체 접근

목차
0. Easy KeygenMe 실습
1. 어셈블리어: MOV, CMP, XOR, MOVZX, MOVSX
2. 알고리즘 분석
3. XOR(⊕) 연산의 결합법칙
4. 소스코드 작성(pseudo code 기반)

[Review] (3주차) 실습

2022.07.04 - [IDA Pro] - IDA Pro 악성코드 정적분석 툴 사용법&실습 - week.03(Easy_CrackMe) (2)

 

IDA Pro 악성코드 정적분석 툴 사용법&실습 - week.03(Easy_CrackMe) (2)

개요 * Easy_CrackMe.exe 실습 리뷰 및 Easy_KeygenMe.exe 파일 실습 1. 디스어셈블리 상세 기능 - 스택 프레임 및 함수 호출 규약의 이해 - 동적 디버깅 사용 및 코드 실행 - 데이터 타입과 데이터 구조 - 기

sarahee.tistory.com


0. Easy KeygenMe 실습

Intro

Find the Name when the Serial is 5B134977135E7D13

Name을 사용해서 시리얼 값 생성, 역으로 시리얼 값을 통해 해당 Name을 찾아내는 문제

초기 디스어셈블리 창
debug Running page
Input Name, Input Serial

시리얼 생성 알고리즘과 관련된 문제 풀이

1) 어셈블리어로 전체적인 구조 파악

2) Hex-rays로 세부 알고리즘 파악

rep stosd: 저장소 문자열 명령

stosb: AL로부터 byte를 읽어 들임, stosw: AX로부터 word를 읽어 들임 - 정수값을 메모리에 복사


1. 어셈블리어: MOV, CMP, XOR, MOVZX, MOVSX

MOV

데이터 복사 명령어

0x10: [esp+140h+var_130]

0x20: [esp+140h+var_12F]

0x30: [esp+140h+var_12E]

Byte 단위로 각각 스택에 넣어줌, 사용자가 입력한 문자열을 첫번째 글자부터 순서대로 Byte 단위로 레지스터에 넣음

CMP

esi가 3 이상이면 0으로 초기화

XOR

두 입력 신호가 서로 같으면 0, 다르면 1, 동일한 두 값초기화

MOVZX

소스의 내용을 목적지로 복사, 목적지의 나머지 부분을 0 padding

(목적지에 32bit register 소스에 16bit register) 

MOVSX

소스의 내용을 목적지로 복사, 목적지의 나머지 부분을 소스의 맨 처음 bit로 채움

(목적지에 32bit register → 소스에 16bit register)

loc_40107E: pseudocode


2. 알고리즘 분석

1) v3이 v8의 strlen이 클 때 까지 반복하고, i가 3 이상이면 0으로 초기화

2) sprintf를 통해 Buffer에 생성된 serial 저장

3) "%s%02X"를 통해 기존 Buffer 내용과 v8 포인터 입력값을 한글자씩 가져옴

4) xor 연산을 한 값을 sprintf 함수를 통해 serial이 저장되는 Buffer에 저장

5) serial을 계산하여 scanf로 입력받은 후, strcmp 함수로 동일한지 비교

- if 0일 때 거짓, 0이 아닐 때 참으로 동작하므로, strcmp 내 0일 경우(문자열이 같을 경우) Correct 출력

 

v6에는 16 16 = 0x10

v7[i - 1]가 될 수 있는 값은, v7[0], v7[1], v7[2]의 반복

qmemcpy: sizeof(v7)만큼 " 0" 영역의 값을 v7로 복사

첫번째 인자(v7): 복사받을 메모리를 가리킴

두번째 인자(" 0"): 복사할 메모리를 가리킴

세번째 인자(sizeof(v7)): 복사할 데이터(값)의 길이(바이트 단위)

 

16진수이므로 두자리씩 끊어서 총 8자리


3. XOR(⊕) 연산의 결합법칙

^: XOR 연산자

p q p ⊕ q (p ⊕ q) ⊕ q
T T F T
T F T T
F T T F
F F F F

(p ⊕ q) ⊕ q ≡ p ⊕ (q ⊕ q) ≡ p ⊕ F ≡ p

 

0x5b^0x10

0x13^0x20

0x49^0x30

0x77^0x10

0x13^0x20

0x5E^0x30

0x7D^0x10

0x13^0x20


4. 소스코드 작성(pseudo code 기반)

# sol1

serial = [0x5B, 0x13, 0x49, 0x77, 0x13, 0x5E, 0x7D, 0x13]
xor = [0x10, 0x20, 0x30]
ans = []

i_xor = 0
for i_ser in range(len(serial)):
    if i_xor >= 3:
        i_xor = 0
    ans.append(serial[i_ser]^xor[i_xor])
    i_xor += 1
    print(chr(ans[i_ser]), end='')

# sol2

serial = [0x5B, 0x13, 0x49, 0x77, 0x13, 0x5E, 0x7D, 0x13]
xor = [0x10, 0x20, 0x30]
ans = []

for i in range(len(serial)):
    ans.append(serial[i]^xor[i%3])
    print(chr(ans[i]), end='')

출력: K3yg3nm3

75 51 121 103 51 110 109 51

Name: K3yg3nm3 / Serial: 5B134977135E7D13

결과값 출력도 전에 창이 닫혀서, cmd로 다시..

Correct!


[Next] (4주차) 이론

2022.07.19 - [Security & Analysis/IDA Pro] - IDA Pro 악성코드 정적분석 툴 사용법&이론 - week.04(전 과정 Review)

 

IDA Pro 악성코드 정적분석 툴 사용법&이론 - week.04(전 과정 Review)

개요 * Easy_KeygenMe.exe 파일 실습 1. 레지스터 활용 분석 - 메모리 주소 및 스택 프레임의 이해 - ESP(스택 포인터), EBP(프레임 포인터), EIP 등 개념 정리 2. 어셈블리 명령어 이해 및 알고리즘 분석 - Pse

sarahee.tistory.com

 

728x90
728x90
728x90
반응형
개요
* Easy_CrackMe.exe 실습 리뷰 및 Easy_KeygenMe.exe 파일 실습
1. 디스어셈블리 상세 기능
- 스택 프레임 및 함수 호출 규약의 이해
- 동적 디버깅 사용 및 코드 실행
- 데이터 타입과 데이터 구조
- 기본 데이터/코드 변환
2. 스택/힙 할당 배열 및 구조체 접근

목차
0. Easy CrackMe 실습 이어서
1. 스택 프레임(stack frame)이란?
2. 레지스터: ESP, EBP, EIP, ECX, EAX
3. 어셈블리어: CMP, LEA, TEST
4. Debugger

[Review] (2주차) 실습 - Easy CrackMe (1)

2022.06.12 - [IDA Pro] - IDA Pro 악성코드 정적분석 툴 사용법&실습 - week.02(Easy_CrackMe) (1)

 

IDA Pro 악성코드 정적분석 툴 사용법&실습 - week.02(Easy_CrackMe) (1)

목차 - 샘플 파일을 이용하여 IDA Pro 실행 - 사용자 인터페이스 및 기본 사용법 이해 * 샘플 자료: reversing.kr > 상단 Challenge 버튼 > Easy Crack (login 필요) 0. IDA Pro란? 1. 실행 파일 로드 2. 디스어셈..

sarahee.tistory.com


0. Easy CrackMe 실습 이어서

Easy_CrackMe.exe 실행시 팝업창
임의의 값을 넣어 확인 버튼 눌렀을 때 Incorrect Password
Alt + T: Enter the search substring(문자열 및 어셈블리어 검색) > Tab: Ctrl + T
MessageBoxA 함수 영역

  • 성공 시의 메시지 출력(Congratulation !!)
  • 실패 시의 메시지 출력(Incorrect Password)

input이 틀렸을 경우 MessageBox로 JMP하게 만드는 분기문 확인

.text:004010B0                 cmp     [esp+68h+var_63], 61h ; 'a'

.text:004010BD                 push    offset Str2     ; "5y"

.text:004010D1                 mov     esi, offset aR3versing ; "R3versing"

.text:0040110D                 cmp     [esp+68h+String], 45h ; 'E'

strcmp: 문자열 비교 함수

strncmp: strcmp + n(검사할 문자의 개수 지정)

형태: char * strncmp( const char *s1, const char *s2, size_t n);

ASCII Table(10진 - 16진 - 문자 변환): 97 - 0x61 - a, 69 - 0x45 - E
ASCII Table
Str2 = 5y, aR3versing = R3versing


1. 스택 프레임(stack frame)이란?

스택에 할당된 메모리 블록, 호출된 함수에 지정

함수가 호출되면,

1) 함수 호출자가 파라미터 형태로 정보를 넘겨줄 때 어딘가에 저장되고, 호출된 함수가 정보를 찾게 해야 한다.

2) 함수의 작업을 위한 임시 저장소가 필요하다.

* 스택: 제한적으로 접근할 수 있는 자료 구조(LIFO, Last In First Out)

* 임시 저장소: 주로 지역 변수가 사용, 함수가 종료되면 더 이상 접근 불가


2. 레지스터: ESP, EBP, EIP, ECX, EAX

예제

32비트 x86 기반 컴퓨터의 컴파일된 함수 코드

void bar(int j, int k); // 호출할 함수
void demo_stackframe(int a, int b, int c) {
	int x;
    char buffer[64];
    int y;
    int z;
    // 스택 프레임 테스트 용도 외에는 다른 목적이 없는 함수
    bar(z, y);
}

지역 변수에 최소 76바이트(3개의 4바이트 정수, 64바이트 버퍼)가 필요

변수 오프셋 ESP 기반 스택 프레임
z [esp] 지역 변수
y [esp+4]
buffer [esp+8]
x [esp+72]
저장된 eip [esp+76]  
a [esp+80] 파라미터
b [esp+84]
c [esp+88]

모든 오프셋은 ESP가 바뀜에 따라 다시 조절

변수 오프셋 EBP 기반 스택 프레임
z [ebp-76] 지역 변수
y [ebp-72]
buffer [ebp-68]
x [ebp-4]
저장된 ebp [ebp] 저장된 레지스터
저장된 eip [ebp+4]  
a [ebp+8] 파라미터
b [ebp+12]
c [ebp+16]

개념 정리

* E: Extended(16bit  32bit system), 64bit에서는 R로 표현

ESP(stack pointer register)

: 현재의 스택 지점(stack의 가장 아래 부분), 스택의 크기를 조정할 때 사용

- 스택에 값을 넣을 때마다 ESP가 4만큼 줄어듦

EBP(base pointer)

: 프레임 포인터를 사용하는 함수를 가리킴(함수가 프레임 포인터를 쓰는지 여부의 분석이 필요할 때, 이 속성을 이용해 수작업으로 지정 가능 - 레지스터의 크기 보정 필요)

- 스택의 가장 윗 부분, 스택 프레임 형태로 저장된 함수의 지역 변수나 전달인자를 참조/변경시 사용하는 레지스터

- 고정적, 코드 유지에 용이(스택프레임 생성시)

EIP(instruction pointer)

: 실행할 명령의 주소


3. 어셈블리어: CMP, LEA, TEST

1) .text:004010B0

.text:004010B0 cmp [esp+68h+var_63], 61h ; 'a'

디스어셈블리 코드 설명
.text:00401080  var_63 스택 프레임에서 바로 참조할 수 있는 모든 변수의 목록을
변수 크기와 프레임 포인터에서 떨어진 거리와 함께 요약해 보여줌
.text:00401080  sub esp, 64h 스택 프레임에 지역 변수를 위한 98바이트(64h 대략 환산) 할당
.text:004010B0  cmp [esp+68h+var_63], 61h dest == source 이면 ZF(Zero Flag) = 1, CF(Carry Flag) = 0

CMP

cmp [esp+68h+var_63], 61h: esp+68h+var_63의 값이 61h 위치에 있는 값과 같은지 비교(값을 빼서 비교)

LEA

lea edi, [esp+68h+var_63]: esp+68h+var_63에 저장된 주소를 esp에 저장

[esp+68h+var_63] 우클릭시 &rarr; [esp+5]

2) .text:004010BD

.text:004010BD push offset Str2 ; "5y"

ECX(Extended Counter Register)

: 주로 반복 명령어 사용시 반복 카운터로 사용

EAX(Extended Accum ulator Register)

: 산술(덧셈, 곱셈, 나눗셈 등) 논리 연산을 수행할 때 사용, 함수의 반환값이 이 레지스터에 저장

TEST

: 인수1과 인수2 내용을 AND 연산하여 결과가 0이면 ZF = 1로 설정(보통 NULL check할 때 사용)

(두 operand가 0이 아닌 경우를 제외하고는 값을 판별하기 어려움 eax, eax와 같은 형태로 사용하여 0인지 아닌지 확인)

[esp+6Ch+Str1] 우클릭시 &rarr; [esp+10]

3) .text:004010D1

.text:004010D1 mov esi, offset aR3versing ; "R3versing"
[esp+70h+var_60] 우클릭시 &rarr; [esp+16]

4) .text:0040110D

.text:0040110D cmp [esp+68h+String], 45h ; 'E'
[esp+68h+String] 우클릭시 &rarr; [esp+4]

주소 해당 문자열 ESP 스택 포인터 10진수 변환 순번
.text:004010B0 a [esp+68h+var_63] [esp+5] 2
.text:004010BD 5y [esp+6Ch+Str1] [esp+10] 3
.text:004010D1 R3versing [esp+70h+var_60] [esp+16] 4
.text:0040110D E [esp+68h+String] [esp+4] 1

참조 순서: E - a - 5y - R3versing


4. Debugger

options: No debugger / Local Bochs debugger / Local Windows debugger / PIN tracer

Remote GDB debugger / Remote Windows debugger / Trace replayer / Windbg debugger

어셈블리 코드 파악을 위한 Local Windows debugger

Start a new process in the debugger or continue a debugged process 클릭시 > Yes
answer: Ea5yR3versing

 


[Next] (4주차) 실습 - Easy KeygenMe

2022.07.04 - [Security & Analysis/IDA Pro] - IDA Pro 악성코드 정적분석 툴 사용법&실습 - week.03(Easy_KeygenMe)

 

IDA Pro 악성코드 정적분석 툴 사용법&실습 - week.03(Easy_KeygenMe)

개요 * Easy_CrackMe.exe 실습 리뷰 및 Easy_KeygenMe.exe 파일 실습 1. 디스어셈블리 상세 기능 - 스택 프레임 및 함수 호출 규약의 이해 - 동적 디버깅 사용 및 코드 실행 - 데이터 타입과 데이터 구조 - 기

sarahee.tistory.com

 

728x90
728x90
728x90
반응형

[Review] (2주차) 실습

2022.06.26 - [Swift] - [Xcode] iOS Swift 앱 개발 Byte Degree - week.02

 

[Xcode] iOS Swift 앱 개발 Byte Degree - week.02

iOS 아키텍처 패턴 중 애플에서는 기본적으로 MVC 패턴을 가이드함 Product Name: HelloiOS Organization Identifier: com.sehee Interface: Storyboard (other options: SwiftUI) Language: Swift (other option..

sarahee.tistory.com


Intro

Swift의 기본 기능, 리스트 및 그리드에 대해 알아보자

Xcode 실행시 기본 스토리보드

File > New > File (or command + n)

view controller 추가하기

Cocoa Touch Class > (Choose options for your new file) Class: StockRankViewController > Next > Create

좌측 Main Tab의 View Controller > 우측 Custom Class - Class 및 Identity - Storyboard ID: StockRankViewController 설정

* Storyboard ID에서 검색이 용이하도록(class 이름 자체가 unique한 id이므로 동일하게 설정해도 무방)

 

Main storyboard에서 우측 상단 + 버튼 클릭하여 UI components(objects) 선택

Collection View 추가

 


Auto rayout 설정

자식 뷰(Collection View)를 부모 뷰(View)에 연관되게 설정하기 위함

control 버튼을 누른 상태에서 Collection View → View 드래그

Shift를 누른 상태에서 클릭하여 다중 선택(상단 네개 Space to Safe Area 모두 클릭) 이후 Enter

View를 Code로 연결하기

해당하는 스토리보드(Collection View) 클릭 후 우측 상단 =(리스트) 아이콘 클릭

Assistant 클릭하여 새로운 view 생성

control 누른 상태에서 연결하고 싶은 뷰(Collection View) → 코드 드래그

name: collectionView > connect

import UIKit

class StockRankViewController: UIViewController {

    @IBOutlet weak var collectionView: UICollectionView!
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destination.
        // Pass the selected object to the new view controller.
    }
    */

}

Connection View Cell 내에 Label, Image View 추가 (option 누르고 드래그할 경우 복제)

Image View는 우측 Image View > Image에서 검색하여 변경 (e.g. heart.fill)

적용: option + command + =

//
//  StockRankViewController.swift
//  StockRank
//
//  Created by sehee on 2022/06/30.
//

import UIKit

class StockRankViewController: UIViewController {

    let stockList: [StockModel] = StockModel.list
    @IBOutlet weak var collectionView: UICollectionView!
    
    // Data, Presentation, Layout
    // Data: 어떤 떼이터? - stockList
    // Presentation: 셀을 어떻게 표현?
    // Layout: 셀을 어떻게 배치?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        collectionView.dataSource = self
        collectionView.delegate = self
    }
}

extension StockRankViewController: UICollectionViewDataSource {
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return stockList.count
    }
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "StockRankCollectionViewCell", for: indexPath)
        return cell
        // return UICollectionViewCell()
    }
}

extension StockRankViewController: UICollectionViewDelegateFlowLayout {
    }
}

extension StockRankViewController: UICollectionViewDelegateFlowLayout {
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        // width == collectionView
        return CGSize(width: collectionView.bounds.width, height: 80)
    }
}

StockRankCollectionViewCell code - data update

//
//  StockRankCollectionViewCell.swift
//  StockRank
//
//  Created by sehee on 2022/07/01.
//

import UIKit

class StockRankCollectionViewCell: UICollectionViewCell {
    // uicomponent 연결하자
    // uicomponent에 데이터 업데이트 하는 코드를 넣자
    @IBOutlet weak var rankLabel: UILabel!
    @IBOutlet weak var companyIconImageView: UIImageView!
    @IBOutlet weak var companyNameLabel: UILabel!
    @IBOutlet weak var companyPriceLabel: UILabel!
    @IBOutlet weak var diffLabel: UILabel!
    
    func configure(_ stock: StockModel) {
        rankLabel.text = "\(stock.rank)"
        companyIconImageView.image = UIImage(named: stock.imageName)
        companyNameLabel.text = stock.name
        companyPriceLabel.text = "\(stock.price) 원"
        diffLabel.text = "\(stock.diff)%"
    }
}

StockRankViewController code - data update

//
//  StockRankViewController.swift
//  StockRank
//
//  Created by sehee on 2022/06/30.
//

import UIKit

class StockRankViewController: UIViewController {

    let stockList: [StockModel] = StockModel.list
    @IBOutlet weak var collectionView: UICollectionView!
    
    // Data, Presentation, Layout
    // Data: 어떤 떼이터? - stockList
    // Presentation: 셀을 어떻게 표현?
    // Layout: 셀을 어떻게 배치?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        collectionView.dataSource = self
        collectionView.delegate = self
    }
}

extension StockRankViewController: UICollectionViewDataSource {
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return stockList.count
    }
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        // guard: as? (꼭 참이어야 하는 조건) else { return (거짓일 경우) } (참일 경우)
        guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "StockRankCollectionViewCell", for: indexPath) as? StockRankCollectionViewCell else {
            return UICollectionViewCell()
        }
        let stock = stockList[indexPath.item]
        cell.configure(stock)
        return cell
    }
}

extension StockRankViewController: UICollectionViewDelegateFlowLayout {
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        // width == collectionView
        return CGSize(width: collectionView.bounds.width, height: 80)
    }
}

가격 표현(쉼표 추가)

//
//  StockRankCollectionViewCell.swift
//  StockRank
//
//  Created by sehee on 2022/07/01.
//

import UIKit

class StockRankCollectionViewCell: UICollectionViewCell {
    // uicomponent 연결하자
    // uicomponent에 데이터 업데이트 하는 코드를 넣자
    @IBOutlet weak var rankLabel: UILabel!
    @IBOutlet weak var companyIconImageView: UIImageView!
    @IBOutlet weak var companyNameLabel: UILabel!
    @IBOutlet weak var companyPriceLabel: UILabel!
    @IBOutlet weak var diffLabel: UILabel!
    
    func configure(_ stock: StockModel) {
        rankLabel.text = "\(stock.rank)"
        companyIconImageView.image = UIImage(named: stock.imageName)
        companyNameLabel.text = stock.name
        companyPriceLabel.text = "\(convertToCurrencyFormat(price: stock.price)) 원"
        diffLabel.text = "\(stock.diff)%"
    }

    func convertToCurrencyFormat(price: Int) -> String {
        let numberFormatter = NumberFormatter()
        numberFormatter.numberStyle = .decimal
        numberFormatter.maximumFractionDigits = 0
        let result = numberFormatter.string(from: NSNumber(value: price)) ?? ""
        return result
    }
}

(추가) 사용자 UI 반영 - 마이너스일 때 파란색 표시, 플러스일 때는 기본 빨간색 표시

# sol1

        var color: UIColor
        if stock.diff > 0 {
            color = UIColor.systemRed
        } else {
            color = UIColor.systemBlue
        }
        diffLabel.textColor = color

# sol2

        diffLabel.textColor = stock.diff > 0 ? UIColor.systemRed : UIColor.systemBlue

최종 코드

//
//  StockRankViewController.swift
//  StockRank
//
//  Created by sehee on 2022/06/30.
//

import UIKit

class StockRankViewController: UIViewController {

    let stockList: [StockModel] = StockModel.list
    @IBOutlet weak var collectionView: UICollectionView!
    
    // Data, Presentation, Layout
    // Data: 어떤 떼이터? - stockList
    // Presentation: 셀을 어떻게 표현?
    // Layout: 셀을 어떻게 배치?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        collectionView.dataSource = self
        collectionView.delegate = self
    }
}

extension StockRankViewController: UICollectionViewDataSource {
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return stockList.count
    }
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        // guard: as? (꼭 참이어야 하는 조건) else { return (거짓일 경우) } (참일 경우)
        guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "StockRankCollectionViewCell", for: indexPath) as? StockRankCollectionViewCell else {
            return UICollectionViewCell()
        }
        let stock = stockList[indexPath.item]
        cell.configure(stock)
        return cell
    }
}

extension StockRankViewController: UICollectionViewDelegateFlowLayout {
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        // width == collectionView
        return CGSize(width: collectionView.bounds.width, height: 80)
    }
}
//
//  StockRankCollectionViewCell.swift
//  StockRank
//
//  Created by sehee on 2022/07/01.
//

import UIKit

class StockRankCollectionViewCell: UICollectionViewCell {
    // uicomponent 연결하자
    // uicomponent에 데이터 업데이트 하는 코드를 넣자
    @IBOutlet weak var rankLabel: UILabel!
    @IBOutlet weak var companyIconImageView: UIImageView!
    @IBOutlet weak var companyNameLabel: UILabel!
    @IBOutlet weak var companyPriceLabel: UILabel!
    @IBOutlet weak var diffLabel: UILabel!
    
    func configure(_ stock: StockModel) {
        rankLabel.text = "\(stock.rank)"
        companyIconImageView.image = UIImage(named: stock.imageName)
        companyNameLabel.text = stock.name
        companyPriceLabel.text = "\(convertToCurrencyFormat(price: stock.price)) 원"
/*        var color: UIColor
        if stock.diff > 0 {
            color = UIColor.systemRed
        } else {
            color = UIColor.systemBlue
        }
        diffLabel.textColor = color
 */
        diffLabel.textColor = stock.diff > 0 ? UIColor.systemRed : UIColor.systemBlue
        diffLabel.text = "\(stock.diff)%"
    }

    func convertToCurrencyFormat(price: Int) -> String {
        let numberFormatter = NumberFormatter()
        numberFormatter.numberStyle = .decimal
        numberFormatter.maximumFractionDigits = 0
        let result = numberFormatter.string(from: NSNumber(value: price)) ?? ""
        return result
    }
}

기본 제공 코드

//
//  StockModel.swift
//  StockRank
//
//  Created by joonwon lee on 2022/04/19.
//

import Foundation

struct StockModel {
    let rank: Int
    let imageName: String
    let name: String
    let price: Int
    let diff: Double
}

extension StockModel {
    static let list: [StockModel] = [
        StockModel(rank: 1, imageName: "TSLA", name: "테슬라", price: 1_238_631, diff: 0.04),
        StockModel(rank: 2, imageName: "AAPL", name: "애플", price: 238_631, diff: 1.04),
        StockModel(rank: 3, imageName: "NFLX", name: "넷플릭스", price: 438_631, diff: -0.04),
        StockModel(rank: 4, imageName: "GOOG", name: "알파벳 A", price: 3_176_631, diff: 0.04),
        StockModel(rank: 5, imageName: "AMZN", name: "아마존", price: 3_538_631, diff: 0.04),
        StockModel(rank: 6, imageName: "NIKE", name: "나이키", price: 158_631, diff: 0.04),
        StockModel(rank: 7, imageName: "DIS", name: "디즈니", price: 138_631, diff: 0.04),
        StockModel(rank: 8, imageName: "TSLA", name: "테슬라", price: 1_238_631, diff: 0.04),
        StockModel(rank: 9, imageName: "AAPL", name: "애플", price: 238_631, diff: 1.04),
        StockModel(rank: 10, imageName: "NFLX", name: "넷플릭스", price: 438_631, diff: -0.04),
        StockModel(rank: 11, imageName: "GOOG", name: "알파벳 A", price: 3_176_631, diff: 0.04),
        StockModel(rank: 12, imageName: "AMZN", name: "아마존", price: 3_538_631, diff: 0.04),
        StockModel(rank: 13, imageName: "NIKE", name: "나이키", price: 158_631, diff: 0.04),
        StockModel(rank: 14, imageName: "DIS", name: "디즈니", price: 138_631, diff: 0.04),
    ]
}

[Next] (4주차) 실습

2022.07.10 - [Dev/Swift] - [Xcode] iOS Swift 앱 개발 Byte Degree - week.04

 

[Xcode] iOS Swift 앱 개발 Byte Degree - week.04

[Review] (3주차) 실습 2022.07.01 - [Swift] - [Xcode] iOS Swift 앱 개발 Byte Degree - week.03 [Xcode] iOS Swift 앱 개발 Byte Degree - week.03 [Review] (2주차) 실습 2022.06.26 - [Swift] - [Xcode] iOS..

sarahee.tistory.com

 

728x90
728x90
728x90
반응형

[Review] (1주차) 실습

2022.06.19 - [Swift] - [Xcode] iOS Swift 앱 개발 Byte Degree - week.01

 

[Xcode] iOS Swift 앱 개발 Byte Degree - week.01

[강의노트] 왕초보를 위한, 한 번에 끝내는 iOS 앱 개발 바이블 https://opposite-foundation-5b5.notion.site/iOS-4b1c2a2c1baf4ae29971524e9bdfc074 [Github] https://github.com/cafielo/fc-ios-bible-for-begi..

sarahee.tistory.com


iOS 아키텍처 패턴 중 애플에서는 기본적으로 MVC 패턴을 가이드함

SF Symbols download

Product Name: HelloiOS

Organization Identifier: com.sehee

Interface: Storyboard (other options: SwiftUI)

Language:  Swift (other options: Objective-C)

command + shift + C

글자 복사

기존 프레임 기반 레이아웃 → 오토레이아웃: 동적으로 뷰 위치

//
//  SymbolRollerViewController.swift
//  SymbolRoller
//
//  Created by sehee on 2022/06/26.
//

import UIKit

class SymbolRollerViewController: UIViewController {

    let symbols: [String] = ["sun.min", "moon", "cloud", "wind", "snowflake"]
    
    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var button: UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
//        button.tintColor = UIColor.systemPink
        // TO-DO:
        // - 심볼에서, 하나를 임의로 추출해서
        // 이미지와 텍스트를 설정
        // DRY: Do not repeat yourself
        reload()
        // Do any additional setup after loading the view.
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
    }
    func reload() {
        let symbol = symbols.randomElement()!
        imageView.image = UIImage(systemName: symbol)
        label.text = symbol
    }
    
    @IBAction func buttonTapped(_ sender: Any) {
        reload()
    }
    
    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destination.
        // Pass the selected object to the new view controller.
    }
    */

}

ViewController: 페이지를 나타내기 위한 객체

option + shift + 8

° 기호

option + command + =

설정값 변경 전(주황색 표시) 업데이트

//
//  WeatherViewController.swift
//  SimpleWeather
//
//  Created by sehee on 2022/06/26.
//

import UIKit

class WeatherViewController: UIViewController {

    @IBOutlet weak var cityLabel: UILabel!
    @IBOutlet weak var weatherImageView: UIImageView!
    @IBOutlet weak var temperatureLabel: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
    
    let cities = ["Seoul", "Tokyo", "LA", "Seattle"]
    let weathers = ["cloud.fill", "sun.max.fill", "wind", "cloud.sun.rain.fill"]
    
    @IBAction func changeeButtonTapped(_ sender: Any) {
        print("도시, 온도, 날씨 이미지 변경하자!")
        cityLabel.text = cities.randomElement()
        let imageName = weathers.randomElement()!
        weatherImageView.image = UIImage(systemName: imageName)?.withRenderingMode(.alwaysOriginal)
        // alwaysTemplate의 경우 default Tint color 적용
        let randomTemp = Int.random(in: 10..<30)
        temperatureLabel.text = "\(randomTemp)°"
    }
    
    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destination.
        // Pass the selected object to the new view controller.
    }
    */

}

 


[Next] (3주차) 실습

2022.07.01 - [Swift] - [Xcode] iOS Swift 앱 개발 Byte Degree - week.03

 

[Xcode] iOS Swift 앱 개발 Byte Degree - week.03

[Review] (2주차) 실습 2022.06.26 - [Swift] - [Xcode] iOS Swift 앱 개발 Byte Degree - week.02 [Xcode] iOS Swift 앱 개발 Byte Degree - week.02 iOS 아키텍처 패턴 중 애플에서는 기본적으로 MVC 패턴을 가..

sarahee.tistory.com

 

 

728x90
728x90
728x90
반응형

[강의노트] 왕초보를 위한, 한 번에 끝내는 iOS 앱 개발 바이블

https://opposite-foundation-5b5.notion.site/iOS-4b1c2a2c1baf4ae29971524e9bdfc074

[Github]

https://github.com/cafielo/fc-ios-bible-for-beginner-2022


Create a new Xcode project > File > New > Playground

iOS - Blank > Next > Save As: HelloSwift


01. 변수, 상수

command + /: 주석 변경

변수/상수에 커서 + option (누르면 ? 표시) + 클릭하면 타입 정보 조회 가능

import UIKit

var greeting = "Hello, playground"

// ---------- 01. 변수, 상수 ----------
// var: 변수(variable) 선언
var num = 5
num = 1

// let: 상수(constant) 선언(값 수정 불가)
var name = "Jason"
name = "Jay"

// String
let quote = "I'm mother father genius, Man"

// Integer
let num2 = 5
let otherNum = num2 + 2         // 7
let halfOfNum = otherNum / 2    // 3

// 내장함수
let num3 = 360
// 3의 배수인지 확인하는 코드
print(num3.isMultiple(of: 3))
// 0~300 사이중 랜덤으로 수를 뽑아내는 메소드
let random = Int.random(in: 0...300)

// Double: 소수점을 포함하는 숫자를 표현
let score = 3.6

 

02. bool-array

// ---------- 02. bool-array ----------
// Boolean
let isMan = true
let isHuman = false

var isSingle = true
isSingle.toggle()
isSingle

// String Interpolation
let difficulty = "쉽다"
let maximumAge = 80

let message = "\(maximumAge) 할머니도 배우는 iOS 개발은 \(difficulty)"

// 배열과 딕셔너리
// Array
let ages = [3, 20, 60]
let colors = ["green", "red", "yellow"]
let color = colors[0]

// Dictionary (Key: Value)
let languageCode = [
    "한국" : "ko",
    "미국" : "en",
    "일본" : "ja",
]

// 비어 있는 배열과 딕셔너리 초기화
var emptyArr: [Int] = []
var emptyDic: [String: Any] = [:]

 

03. enum

// ---------- 03. enum ----------
// 서로 관계있는 값들을 모아서 표현한 것
enum WeekDay {
    case mon
    case tue
    case wed
    case thu
    case fri
}
var today: WeekDay = .mon
// var tod: String = "mon"      // error(mom)시 찾기 힘듦

enum MediaType {
    case audio
    case video
}
var mediaType: MediaType = .audio

// 위에서 만들어본 미디어 타입에, 파일 확장자도 문자열로 받을 수 있게 수정
enum MediaType2 {
    case audio(String)
    case video(String)
}
var mp3: MediaType2 = .audio("mp3")
var h264: MediaType2 = .video("h264")

 

04. 조건문, 반복문

// ---------- 04. 조건문, 반복문 ----------
let age = 10
// if문의 조건절에는 boolean 타입을 사용 (e.g. age > 20)
if age > 20 {
    print("성인 입니다")
} else {
    print("미성년 입니다")
}

if age >= 10 && age < 20 {
    print("10대 입니다")
} else if age >= 20 && age < 30 {
    print("20대 입니다")
} else if age >= 30 && age < 40 {
    print("30대 입니다")
} else if age >= 40 && age < 50 {
    print("40대 입니다")
} else {
    print("......")
}

enum Weather {
    case sun
    case cloud
    case rain
}

var weather: Weather = .sun
switch weather {
case .sun:
    print("맑아요")
case .cloud:
    print("흐려요")
case .rain:
    print("비와요")
}

// 배열과 딕셔너리 아이템을 순차적으로 체크할 때 사용
let ages2 = [3, 20, 60]
let languageCode2 = [
    "한국" : "ko",
    "미국" : "en",
    "일본" : "ja",
]
for age in ages2 {
    print("age: \(age)")
}
for (key, value) in languageCode2 {
    print("\(key)의 언어코드는 \(value)")
}

// 일정 횟수를 단순 반복
print("전방에 다짐 10번 발사~~!")
for _ in 0..<10 {
    print("나는 iOS 개발자다!")
}

// while: 특정 조건을 이용해서 반복
var count = 10
print("Ready!")
while count > 0 {
    print("\(count)...")
    count -= 1
}
print("START!")

 

05. 옵셔널

// ---------- 05. 옵셔널 ----------
// 값이 있을수도 있고 없을수도 있음을 표현
// Dictionary (Key: Value)
let languageCode3 = [
    "한국" : "ko",
    "미국" : "en",
    "일본" : "ja",
]
// let 상수 타입은 String? (타입 + ?)
let krCode = languageCode3["한국"]    // "ko"
let jpCode = languageCode3["일본"]    // "ja"
let deCode = languageCode3["독일"]    // nil

// 이름이 있을 수도 있고 없을 수도 있는 타입 선언 - String?
var name2: String? = nil
name2 = "Jason"
name2 = nil

 

06. 함수, 클로저

// ---------- 06. 함수, 클로저 ----------
// 함수는 func 키워드를 사용해서 선언
func printGugu(dan: Int) {
    for i in 1...9 {
        print("\(dan) * \(i) = \(dan * i)")
    }
}
printGugu(dan: 5)

func rollDice() -> Int {
    return Int.random(in: 1...6)
}
let random2 = rollDice()

// 클로저: 이름이 존재하지 않는 함수
// 함수
func call(name: String) {
    print("hello, \(name)")
}
call(name: "Jason")
// 상수에 함수를 할당하고, 해당 상수를 호출
let callName = call
callName("Aha")
// 상수에 클로저 할당하고, 해당 상수 호출
let helloName = { (name: String) in
    print("hello, \(name)")
}
helloName("Oho")
// 클로저 형태: 함수와 거의 동일, in을 통해 파라미터 및 반환 타입과 실제 클로저 코드 분리
// { (name: String) -> Bool in ~ some code ~ }
// filter
let members = ["Jason", "Greg", "Tiffany"]
let nameHasT = members.filter { name in
    return name.hasPrefix("T")
}
// map
let prices = [1000, 2000, 3000]
let doubledPrices = prices.map { price in
    return price * 2
}
// reduce
let revenues = [100, 200, 300]
let totalRevenue = revenues.reduce(0) { partialResult, next in
    return partialResult + next
}

 

07. 클래스 구조체1

// ---------- 07. 클래스 구조체1 ----------
struct Album {
    // 멤버 변수들 - stored property
    let title: String
    let artist: String
    var isReleased = false
    
    // 생성자: 클래스 또는 구조체를 생성할 때 사용하는 특별한 함수(init 키워드로 선언)
//    init(title: String, artist: String) {
//        self.title = title
//        self.artist = artist
//    }
    func description() -> String {
        return "\(title) by \(artist)"
    }
    // 구조체 내부 멤버 변수의 값을 변경하는 경우, mutating 키워드 이용
    mutating func release() {
        self.isReleased = true
    }
}
var easyOnMe = Album(title: "Easy On Me", artist: "Adele")
print(easyOnMe.description())
print(easyOnMe.isReleased)
easyOnMe.release()
print(easyOnMe.isReleased)

// 클래스: 상속 가능   참조(reference)   생성자를 기본으로 만들어주지 않음
// 구조체: 상속 불가능  복사(copy)
class Employee {
    var name: String
    var hours: Int
    
    init(name: String, hours: Int) {
        self.name = name
        self.hours = hours
    }
    func work() {
        print("I'm working now...")
    }
    func summary() {
        print("I work \(self.hours) hours a day. ")
    }
}
class iOSDeveloper: Employee {
    override func work() {
        print("I'm developing iOS app now.")
    }
    override func summary() {
        print("I work \(self.hours/2) hours a day.")
    }
}
struct Phone {
    var modelName: String
    var manufacturer: String
    var version: Double = 1.0
}

let normalWorker = Employee(name: "Kim", hours: 8)
normalWorker.work()
normalWorker.summary()
//    I'm working now...
//    I work 8 hours a day.
let developer = iOSDeveloper(name: "Jason", hours: 8)
developer.work()
developer.summary()
//    I'm developing iOS app now.
//    I work 4 hours a day.

// Reference vs. Copy
var iPhone1 = Phone(modelName: "iPhone 13", manufacturer: "Apple")
var iPhone2 = iPhone1
iPhone2.modelName = "iPhone 14"
print(iPhone2.modelName)
print(iPhone1.modelName)
//    iPhone 14
//    iPhone 13
var jrDeveloper1 = iOSDeveloper(name: "John", hours: 8)
var jrDeveloper2 = jrDeveloper1
jrDeveloper1.name = "Billy"
print(jrDeveloper1.name)
print(jrDeveloper2.name)
//    Billy
//    Billy

 

08. 클래스 구조체2

// ---------- 08. 클래스 구조체2 ----------
// stored property: 클래스, 구조체가 값을 저장하고 있는 프로퍼티
// computed property: 따로 값 저장하지 않음, stored property를 활용학거나 특정값을 전달할 때 사용하는 프로퍼티
struct Watch {
    let model: String
    let manufacturer: String
    
    var description: String {
        return "\(model) by \(manufacturer)"
    }
}
struct Person {
    let firstName: String
    let lastName: String
    
    var fullName: String {
        return "\(firstName) \(lastName)"
    }
}
let appleWatch = Watch(model: "Watch 7", manufacturer:  "Apple")
print(appleWatch.description)
// Watch 7 by Apple
let jason = Person(firstName: "Jason", lastName: "Lee")
print(jason.fullName)
// Jason Lee

 

09. 프로토콜

// ---------- 09. 프로토콜 ----------
// 제공하고 싶은 역할(기능, 속성)을 미리 정의해 놓은 것
// 이후에 다른 타입이 해당 프로토콜의 역할을 제공하고 싶으면, conform해서 제공함
protocol Coach {
    var name: String { get set }
    var currentTeam: String { get }
    func training()
    func direct()
}
struct Mourinho: Coach {
    var name: String = "Jose Mourinho"
    var currentTeam: String = "AS Roma"
    
    func training() {
        print("Traing Player")
    }
    
    func direct() {
        print("Direct Game")
    }
}
let mourinho = Mourinho()
print("\(mourinho.name), \( mourinho.currentTeam)")
mourinho.training()
mourinho.direct()
//    Jose Mourinho, AS Roma
//    Traing Player
//    Direct Game

 

10. 익스텐션

// ---------- 10. 익스텐션 ----------
// 기존 타입에 새로운 역할(기능 및 속성)을 추가하고 싶을 때 사용
extension String {
    func contains(s: String) -> Bool {
        return self.range(of: s) != nil
    }
    func replace(target: String, with: String) -> String {
        return self.replacingOccurrences(of: target, with: with)
    }
}
let testString = "Hello iOS Developer!!"
let replaced = testString.replace(target: "Hello", with: "안녕하세요")
print(replaced)
//    안녕하세요 iOS Developer!!
print(testString.contains(s: "iOS"))
// true

 

11. 앞으로 스위프트 공부방향

swift language apple

https://developer.apple.com/kr/swift/

swift language guide

https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html

 


[Next] (2주차) 실습

2022.06.26 - [Swift] - [Xcode] iOS Swift 앱 개발 Byte Degree - week.02

 

[Xcode] iOS Swift 앱 개발 Byte Degree - week.02

iOS 아키텍처 패턴 중 애플에서는 기본적으로 MVC 패턴을 가이드함 Product Name: HelloiOS Organization Identifier: com.sehee Interface: Storyboard (other options: SwiftUI) Language: Swift (other option..

sarahee.tistory.com

 

 

728x90
728x90
728x90
반응형

개요

- 샘플 파일을 이용하여 IDA Pro 실행
- 사용자 인터페이스 및 기본 사용법 이해
* 샘플 자료: reversing.kr > 상단 Challenge 버튼 > Easy Crack (login 필요)

목차
0. IDA Pro란?
1. 실행 파일 로드
2. 디스어셈블리 윈도우
3. 자주 쓰는 단축키
4. 추가 뷰 조회
5. Easy CrackMe 실습
6. IDA database 종료시 설정
7. 기타 분석 개념 정리

[Review] (1주차) 기본 이론

2022.05.22 - [IDA Pro] - IDA Pro 악성코드 정적 분석 툴 사용법(기본 개념 이론) - week.01

 

IDA Pro 악성코드 정적 분석 툴 사용법(기본 개념 이론) - week.01

목차 1. 컴퓨터 언어: 기계어, 어셈블리어, 고급언어 2. 언어 번역: 컴파일/디컴파일, 어셈블/디스어셈블 3. 빌드 과정: 전처리기, 컴파일러, 어셈블러, 링커 4. IDA, Hex-rays 개념 5. 세대별 언어 특징 1

sarahee.tistory.com


실습 진행 과정

1. IDA 파일 정보 확인
- IDA 로딩 파일(.idb), 데이터베이스 파일(.id0, .id1, .nam, .til)
2. IDA 툴 기능의 이해
- IDA 데스크탑/그래프 뷰 등 화면 동작/기능 파악
- 데이터 타입/코드 변환 등 설정 대화상자 기능 파악
- pseudo code 조회, 다른 함수로 변환 등
3. 코드 표기 이해(헥사 뷰, 디스어셈블리 뷰 동기화 등)

 


0. IDA Pro란?

Interactive Disassembler Professional, 핵스레이(Hex-Rays)사에서 배포한 디스어셈블러 도구

상호작용이 가능한 대화형으로 작성됐으며, 디스어셈블러 과정의 모든 부분을 수정, 조작, 재배치, 재정의 가능

- 악성코드 분석, 역공한 엔지니어링, 취약점 분석

분석하고자 하는 대상의 바이너리(파일)가 몇 비트 대상으로 컴파일 되었는지에 따라 결정 (32bit, 64bit)


1. 실행 파일 로드

IDA Pro는 파일 포맷과 프로세서 아키텍처를 인식

1) Load file

Portable executable for 80386 (PE) [pe.dll]: windows 운영체제에서 정의한 파일 포맷, 기본 윈도우 실행 파일로 인식

→ 운영체제 로더가 로딩하는 것처럼 메모리에 파일 매핑

MS-DOS executable (EXE) [dos.dll]: 확장 형태가 PE 파일

Binary file: IDA Pro가 파일을 원본(raw) 바이너리로 디스어셈블, 기본적으로 제공하는 파일 분석 방법

(IDA가 인식하지 못하는 경우 대비, 인식하는 로더가 없는 경우 저수준 분석 작업)

2) Processor type

MetaPC (disassemble all opcodes): 프로세스 모듈

- IDA 로더가 대부분 실행 파일 헤더 분석에 기초하여 알맞은 프로세스 선택

3) Options

Manual load: 파일을 로드하는 새로운 가상 주소를 명시하는 입력 박스를 볼 수 있음

Load file format Architecture
Portable executable for 80386 (PE) [pe.dll] x86 아키텍처, 32bit, RAM 4GB까지 가능(메모리 인식률)
Portable executable for AMD64 (PE) [pe64.dll] x64 아키텍처, 64bit

* PE 파일 포맷 기준

  • PE 파일(Portable Executable): 윈도우용 실행 파일 포맷
  • COFF(Common Object File Format): 유닉스용 공유 라이브러리 포맷
  • ELF(Executable Linking Format): 유닉스용 실행 파일 포맷

IDA 데이터베이스 파일 생성

1) id0: B 트리 형태의 데이터베이스

2) id1: 각 프로그램 바이트를 기술하는 플래그 데이터베이스

3) nam: 네임 창에서 이름 붙인 프로그램 위치의 인덱스 정보 데이터베이스

4) til: 해당 데이터베이스에서 정해준 지역 타입 정의 데이터베이스

* 각 파일의 포맷은 확인 불가(IDA 미제공)


2. 디스어셈블리 윈도우

(참고용) Optional Manual load 체크시 화면

디스어셈블리 윈도우는 두 모드 출력(Space bar로 전환) (그래프 모드 ↔ 텍스트(리스트) 모드)

1) 그래프 모드

플로우 차트 형식으로 단일 함수의 내역 조회, 행 번호/명령어 코드 배제

(면적을 최소한으로 줄이고자) 전반적으로 디스어셈블 코드 라인에 대한 정보가 많이 제외됨

초기 디스어셈블리 창(WinMain) - 바이너리를 조작하고 분석하는 주요 위치(어셈블리 코드 위치)

설정 변경

Options > General 팝업창(IDA Options) > Display disassembly line parts 에서

(1) Line prefixes (graph)

: 위치 찾기에 용이 (e.g. .text:0040131A)

(2) Number of opcode bytes (graph) = 6

: 기본 0으로 설정되어 있으며, 대부분의 명령어는 6바이트 이하이므로 6으로 변경 (e.g. 39 3D 64 85 40 00)

그래프 모드

화살표의 색깔과 방향을 이용하여 프로그램의 흐름을 파악할 수 있음

  • 녹색: 조건 점프(conditional jump)했을 경우(Yes)
  • 빨간색: 조건 점프가 아닐 경우(No)
  • 푸른색: 무조건 점프(unconditional jump)(연속 블록)

2) 텍스트 모드

바이너리 데이터 영역을 볼 때 사용

텍스트 모드

화살표 윈도우(arrows window): 출력 왼쪽, 프로그램의 비선형 흐름(nonlinear flow)를 보여줌

  • 실선: 무조건 점프
  • 점선: 조건 점프
  • (위를 향하는) 굵은 점선 화살표: 반복 구문 암시

 

IDA Pro의 자동 주석 기능

Options > General > ☑ Auto comments

  • sub link: 함수 시작 링크 (e.g. printf, sub_401080)
  • loc link: 목적지(location)로 점프하는 링크 (e.g. loc_401102, loc_4010FE)
  • offset link: 메모리 내의 오프셋 링크 (e.g. push offset Caption)

* offset link: 참조 위치로 점프해 출력할 때 유용, 메모리 내 정의한 위치로 이동

 

Compare Two Operands
Logical Compare
Logical Exclusive OR
Integer Subtraction with Borrow

...

앞으로/뒤로 가기 버튼

앞으로/뒤로 가기 버튼: 작업 내역 이동, 디스어셈블리 윈도우에서 새로운 위치를 탐색할 때마다 작업 내역에 추가

←: Esc / → : Ctrl + Enter

 

IDA Pro 인터페이스는 매우 다양해서, 원 위치로 되돌아오기 거의 불가능함

돌아오려면 Windows > Reset desktop 선택 (레이블 작업은 그대로, 윈도우와 GUI 인터페이스만 기본으로 복구)

저장하려면 Windows > Save desktop 선택

overview navigator, 탐색 밴드(navigation band)

로드한 바이너리 주소 영역을 코드에 따라 선형으로 보여줌

노란색 위치 화살표: 현재의 위치

하늘색: FLIRT로 인식한 라이브러리 코드 (COLLAPSED FUNCTION)

회색: 정의된 데이터

갈색: 정의되지 않은 데이터

분홍색: import, 외부 기호

빨간색: 컴파일러가 생성한 코드

파란색: 사용자가 작성한 코드(악성코드 분석 수행)

* IDA Pro는 FLIRT(Fast Library Identification and Recognition Technology)라 하여,

고속 라이브러리 식별과 인식 기술에 확장된 코드 시그니처를 포함하고 있음

→ 디스어셈블한 함수와 컴파일러가 추가된 라이브러리 코드를 식별해 label 가능


3. 자주 쓰는 단축키

Search > Next Code: 지정한 명령어를 담고 있는 다음 위치 커서로 이동

Search > Text: 전체 디스어셈블리 윈도우에서 특정 문자열 검색

Search > Sequence of Bytes: 특정 바이트 순서로 16진수 보기 윈도우에 있는 바이너리 검색 수행

G: Jump to address

G or Jump > Jump to File Offset 선택

특정 가상 주소로 점프 (e.g. 문자열, 셸코드, sub_401080, printf)

Ctrl + P: Choose function to jump to

Ctrl + P

특정 함수 조회 및 이동

F2: Break Point

F2

debbuging 모드의 break point

Pseudo Code

F5

IDA View에서 변환을 원하는 함수를 클릭한 뒤 F5 → 프로그래밍 변환되어 창 생성

특정 프로그래밍 언어의 문법이 아니라, 일반적인 언어로 코드를 흉내 내어 알고리즘을 써놓은 코드


4. 추가 뷰 조회

헥사 뷰(Hex View)

헥사 뷰(Hex View)

우클릭하여 Synchronize with > IDA View-A 확인

Edit 메뉴: 헥사 에디터 (수정 이후 commit이나 취소하여 view 모드로 돌아옴)

Data Format 메뉴로 표시되는 형식을 n진수 형태로 보여줌

구조체 창(Structures)

구조체 창(Structures)

바이너리에서 사용됐다고 판단된 C 구조체나 공용체 같은 복합 구조체를 보여줌

 

  • 열거 창(Enums): 구조체 창과 유사, IDA가 표준 열거형 데이터 타입을 찾았다면 표시
  • 임포트 창(Imports): 바이너리에서 분석된 임포트된 모든 함수 목록 조회(바이너리가 공유 라이브러리를 사용할 때만 유효함), 정적 링크된 바이너리는 외부 의존도가 없기 때문에 임포트될 사항이 없음
  • 익스포트 창(Exports): 파일의 진입점(entry point) 목록 조회
  • 문자열 창, 네임 창, 세그먼트 창, 시그니처 창, 타입 라이브러리 창, 함수 호출 창, Problems 창, ...

5. Easy CrackMe 실습

Easy_CrackMe.exe 실행시 팝업창
임의의 값을 넣어 확인 버튼 눌렀을 때 Incorrect Password
Quick view: Ctrl + 1 - Names view 선택

Ctrl + 1

Quick view 조회

Alt + T: Enter the search substring(문자열 및 어셈블리어 검색)

Alt + T

문자열 및 어셈블리어 검색

Ctrl + T

방금 팝업창에 조회된 문자열 검색(Tab 기능)

더블클릭하여 해당 함수로 이동

우클릭 > List cross references to... or Ctrl + X

xref, 커서가 가르키는 주소를 참조하는 곳을 조회

함수 확인
Text search 결과 (☑ Find all occurrences)
Alt + T > Congratulation
MessageBoxA 함수 영역

  • 성공 시의 메시지 출력(Congratulation !!)
  • 실패 시의 메시지 출력(Incorrect Password)

  • strcmp: 문자열 비교 함수
  • strncmp: strcmp + n(검사할 문자의 개수 지정)

input이 틀렸을 경우 MessageBox로 JMP하게 만드는 분기문 확인

[text:004010B5, 004010CD, 0040110B, 00401112]

'a' '5y' 'R3versing' 'E'

Ea5yR3versing


6. IDA database 종료시 설정

IDA 데이터베이스 닫기

데이터베이스가 닫혔던 상태 그대로의 환경에서 작업을 시작하게 해줌

IDB 파일 - IDA 데이터베이스 파일

현재 프로젝트 파일을 닫을 때 문제 없다면 압축되어 IDB 파일 생성 (기존 파일이 남아있다면 데이터베이스 손상)

- 가끔 크래시가 발생(e.g. IDA 버그, 설치 플러그인의 문제)


7. 기타 분석 개념 정리

0부 | 악성코드 분석 입문 (p.47~)

악성코드(malware)

일반적인 유형: 바이러스(virus), 트로이 목마(trojan horse), 웜(worm), 루트킷(rootkit), 스케어웨어(scareware), 스파이웨어(spyware)

목표: 네트워크 침입 대응에 필요한 정보를 알아내기 위함, 정확히 무슨 일이 발생했는가? 감염된 시스템과 파일이 무엇인까?

목적: 의심스러운 특정 바이너리가 하는 행위, 네트워크에서 탐지하는 방법, 피해 범위 측정

- 악성코드 분석을 통해 호스트 기반과 네트워크 기반의 시그니처 생성

* 네트워크 시그니처: 네트워크 트래픽 모니터링을 통해 악성 코드를 탐지할 때 사용

악성코드의 유형

1) 백도어(backdoor): 공격자의 접근 허용 목적으로 컴퓨터에 자기 자신을 설치하는 악성코드

2) 봇넷(botnet): 공격자가 시스템에 접속 가능, 동일한 봇넷에 감염된 모든 컴퓨터가 하나의 명령 제어(C&C, Command-and-Control) 서버로부터 동일한 명령어 수신

3) 다운로더(downloader): 다른 악성코드를 다운로드할 목적만으로 존재하는 악성코드

(1) 시스템에 처음 접근 권한을 얻으면 공격자는 다운로더를 설치

(2) 다운로더 프로그램은 추가 악성코드를 다운로드하고 설치

4) 정보 유출 악성코드(information-stealing malware): 피해자의 컴퓨터에서 정보를 수집해서 공격자에게 전송하는 악성코드

- 이메일이나 온라인 뱅킹 같은 온라인 거래에 접근 권한을 얻고자 할 때 사용

(e.g. 스니퍼, 패스워드 해시 수집기, 키로거)

5) 실행기(launcher): 다른 악성 프로그램을 실행할 때 사용하는 악성 프로그램

- 시스템의 상위 권한이나 은폐를 위해 다른 악성 프로그램을 실행할 때 이전 기법과 다른 기법을 사용

6) 루트킷(rootkit): 다른 코드 내에서 자신의 존재를 숨기도록 설계한 악성코드

- 백도어 같은 다른 악성코드를 함께 사용(공격자의 원격 접속 허용과 피해자의 코드 탐지를 어렵게 만들기 위함)

7) 스케어웨어(scareware): 감염된 사용자가 뭔가를 구매하게 겁을 주는 악성코드

8) 스팸 전송 악성코드(spam-sending malware): 사용자의 장비를 감염시켜 스팸을 전송하는 데 이용하는 악성코드

9) 웜/바이러스(worm/virus): 자기 자신을 복제해 추가로 컴퓨터를 감염

 

1부 | 기초 분석 (p.55~)

악성 여부를 판단하는 안티바이러스 도구 사용

악성코드를 판별하는 해시 사용

파일의 문자열, 함수, 헤더에서 개략적인 정보 수집

 

안티바이러스 스캐닝 - 해시:악성코드에 대한 지문 - 문자열 검색

안전한 해시 알고리즘 1(SHA-1, Secure Hash Algorithm)

메시지 다이제스트 알고리즘 5(MD5, Message-Digest Algorithm)

 


[Next] (3주차) 실습 - Easy CrackMe (2)

2022.07.04 - [IDA Pro] - IDA Pro 악성코드 정적분석 툴 사용법&실습 - week.03(Easy_CrackMe, Easy_KeygenMe) (1)

 

IDA Pro 악성코드 정적분석 툴 사용법&실습 - week.03(Easy_CrackMe, Easy_KeygenMe) (1)

목차 * Easy_CrackMe.exe 실습 리뷰 및 Easy_KeygenMe.exe 파일 실습 1. 디스어셈블리 상세 기능 - 스택 프레임 및 함수 호출 규약의 이해 - 동적 디버깅 사용 및 코드 실행 - 데이터 타입과 데이터 구조 - 기

sarahee.tistory.com

 

728x90
728x90
728x90
반응형
목차
1. 컴퓨터 언어: 기계어, 어셈블리어, 고급언어
2. 언어 번역: 컴파일/디컴파일, 어셈블/디스어셈블
3. 빌드 과정: 전처리기, 컴파일러, 어셈블러, 링커
4. IDA, Hex-rays 개념
5. 세대별 언어 특징

1. 컴퓨터 언어: 기계어, 어셈블리어, 고급언어

기계어 - 어셈블리어 - 고급언어

1) 기계어(Machine Language)

개념: CPU가 별다른 해석(컴파일) 없이 읽을 수 있는 프로그래밍 언어(컴퓨터가 사용하는 언어), 프로그램을 나타내는 가장 낮은 단계

예시: 

1000 1011 0100 0101 1111 1000 -> 8b 45 f8

0000 0011 0100 0101 1111 1100 -> 03 45 fc

 

2) 어셈블리어(Assembly Language)

개념: 기계어의 숫자를 사람들이 이해하기 쉽게 만든 언어, CPU의 명령어들을 영어 약자로 표기(기호와 CPU의 명령어가 일대일 대응)

예시: 1000 1011 → MOV (저급 언어)

 

3) 고급 언어(High-Level Language)

개념: 사람들이 이해하기 편하도록 만들어진 프로그래밍 언어(사람의 언어에 가까운지를 표현하는 단어)

특징: 특정한 컴퓨터의 구조나 프로세서와 무관하게, 독립적으로 프로그램을 작성

비교: 프로그래밍 언어의 문법 구조가 기계어와 유사하면 '저급 언어(Low-Level Language)'

예시: 고급 언어(C++, Java, C#), 중급 언어(Middle-Level Language, C)

2. 언어 번역: 컴파일/디컴파일, 어셈블/디스어셈블

  • 어셈블러(assembler): 기호를 이진수로 변환하는 프로그램(어셈블리어 → 기계어)
  • 컴파일러(Compiler): 고급 언어로 작성된 명령어를 기계어로 변경하는 프로그램

어셈블러와 컴파일 작업을 역으로 수행하는 툴: 디스어셈블러와 디컴파일러

  • 디스어셈블러: 어셈블리 과정을 되돌려서 결과물로 어셈블 코드 생성(기계어 → 어셈블리어)
  • 디컴파일러: 어셈블리/기계어(입력) → 고급언어(출력)

전통적인 소프트웨어 개발 모델은 컴파일러, 어셈블러, 링커로 실행 파일을 만든다.

* 링킹(linking): 여러 개의 코드와 데이터를 모아서 연결하여 메모리에 로드/실행 가능한 한 개의 파일로 만드는 작업

* 링커(linker): 링크 에디터(link editor), 소프트웨어 개발에서 독립적인 컴파일을 가능하게 하는 프로그램

 

컴파일러가 만들어낸 하나 이상의 목적 파일을 가져와 단일 실행 프로그램으로 병합

다시 말해서, 프로그램이나 라이브러리 등 컴파일 이후 연결하는 과정

 

Build Process(C): 전처리기 - 컴파일러 - 어셈블러 - 링커

3. 빌드 과정: 전처리기, 컴파일러, 어셈블러, 링커

gcc program.c
gcc program.c -o program

1) 전처리기(Preprocessor): 전처리기 구문 처리(디렉토리/컴파일러 라이브러리 폴더에서 헤더파일 include, define 값 치환)

gcc -E program.c -o program.i
include <stdio.h>
defind A 10

 

2) 컴파일러(Compiler): 고수준 언어를 저수준 언어(기계어와 가까운)로 나타나는 역할

gcc -S program.i -o program.s
.file   "program.c"
        .section        .rodata
.LC0:
        .string "%d + %d = %d\n"
        .text
        .globl  main
        .type   main, @function
main:

3) 어셈블러(Assembler): 완전히 기계어로 바꿔주는 역할

gcc -c program.s -o program.o
^?ELF^B^A^A^@^@^@^@^@^@^@^@^@^A^@>^@^A^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@È^B^@^@^@^@^@^@^@^@^@^@@^@^@^@^@^@@^@^M^@
^@UH<89>åH<83>ì^PÇEü
^@^@^@ÇEø^T^@^@^@<8b>Eø<8b>Uü^AÐ<89>Eô<8b>Mô<8b>Uø<8b>Eü<89>Æ¿^@^@^@^@¸^@^@^@^@è^@^@^@^@ÉÃ%d + %d = %d

 

4) 링커(Linker): 여러 개의 오브젝트 파일 혹은 라이브러리를 합칠 때 사용

gcc program.o -o program.exe

5) 실행

./program.exe

4. IDA, Hex-rays 개념

IDA(Interactive Disassembler): malware reverse engineering tools

  • IDA Pro: 기본적으로 디스어셈블러(Dis-Assembler)의 속성을 가짐
  • Hex-rays: 디컴파일러(De-Compiler) 플러그인

디스어셈블리란?

disassembly: (명, n)분해, disassemble: (동, v)분해하다

 

디스어셈블리가 필요한 이유: 소스코드가 없을 때 프로그램을 이해하는데 주로 사용

1) 멀웨어 분석

동적 분석(dynamic analysis): 제어할 수 있는 환경하에서(샌드박스) 멀웨어를 실행시켜 가며 여러 가지 시스템 툴을 사용해 행동을 관측하는 것

정적 분석(static analysis): 프로그램 코드를 읽어가며 프로그램의 행동 분석

2) 취약점 분석: 취약점이 있는 프로그램의 소스를 알지 못할 경우 분석이 필요할 때

취약점 발견, 취약점 분석, 개발

프로그램의 잠재적 취약점 발견: 동적분석 퍼징(Fuzzing) 이용

* Fuzzing: 취약점 발견을 위한 기술, 대량의 고유한 입력 값 생성하고 어떤 것이 프로그램의 동작을 문제로 일으키는지 파악/분석/이용

3) 소프트웨어 상호 연동: 상호 연동이 필요한 프로그램의 소스를 알지 못할 경우 분석이 필요할 때

4) 컴파일러 검증: 컴파일러가 생성한 코드가 성능이 제대로 됐는지, 결과물이 제대로 됐는지 검증이 필요할 때

5) 디버깅 디스플레이: 디버깅 중 프로그램의 인스트럭션을 표시하고자 할 때


5. 세대별 언어 특징

1세대 언어

대표: 기계어로 비유됨

특징: 가장 저수준 형태로, 1과 0으로 구성. 16진수(hexa decimal)

2세대 언어

대표: 어셈블리 언어

특징: 니모닉(mnemonic)으로 인해 프로그래머가 연산을 기억하기 쉽게 변화함

* 니모닉: 짧으면서 특징 있는 문자열 (니모닉 코드: 연상 기호 코드, 기계어와 일대일로 대응하는 명령어)

* 어셈블러: 어셈블리 언어 프로그램을 실행 가능한 기계어로 바꿔주는 툴

3세대 언어

대표: fortran, cobol, C, JAVA

특징: 의미 단위로 블록을 묶음, 플랫폼(기계, H/W) 독립적인 형태로 작성

4세대 언어

대표: SQL, Visual C++, Visual Basic

특징: 비절차 언어(절차 언어의 대표는 C), 특정 응용 프로그램과 함께 지원(DB 접근에 이용되는 SQL 등)

5세대 언어

대표: Prolog(부족)

특징: 초고급언어, 인공지능 분야의 원리를 사용하는 시스템을 위해 개발된 언어(자연어 처리 등)

 


[Next] 2주차 실습(Easy CrackMe.exe)

2022.06.12 - [IDA Pro] - IDA Pro 악성코드 정적분석 툴 사용법&실습 - week.02(Easy_CrackMe) (1)

 

IDA Pro 악성코드 정적분석 툴 사용법&실습 - week.02(Easy_CrackMe) (1)

목차 - 샘플 파일을 이용하여 IDA Pro 실행 - 사용자 인터페이스 및 기본 사용법 이해 * 샘플 자료: reversing.kr > 상단 Challenge 버튼 > Easy Crack (login 필요) 0. IDA Pro란? 1. 실행 파일 로드 2. 디스어셈..

sarahee.tistory.com

 

728x90
728x90
728x90
반응형
The IDA Pro Book (2nd Edition) 한국어판 - 리버스 엔지니어링에 날개를 달다

 - 목차 - 

 

1부 IDA 소개

1장 | 디스어셈블러 소개

2장 | 리버싱과 디승셈블리툴

3장 | IDA 프로 배경 지식

 

2부 IDA 기본 사용법

4장 | IDA 시작

5장 | IDA 데이터 디스플레이

6장 | 디스어셈블리 살펴보기

7장 | 디스어셈블리 다루기

8장 | 데이터 타입과 데이터 구조

9장 | 상호 참조와 그래프

10장 | 여러 가지 IDA

 

3부 IDA 고급 사용법

11장 | IDA 커스터마이징

12장 | FLIRT 시그니처로 라이브러리 인식

13장 | IDA 심층 탐구

14장 | 바이너리 패칭과 IDA 제약 사항

 

4부 IDA의 기능 확장

15장 | IDC 스크립팅

16장 | IDA SDK

17장 | IDA 플러그인 아키텍처

18장 | 바이너리 파일과 IDA 로더 모듈

19장 | IDA 프로세서 모듈

 

5부 실제 애플리케이션

20장 | 다양한 컴파일러

21장 | 난독화된 코드 분석

22장 | 취약점 분석

23장 | 실제 IDA 플러그인

 

6부 IDA 디버거

24장 | IDA 디버거

25장 | 디스어셈블러/디버거 통합

26장 | 추가 디버거 기능

 

부록 A IDA 5.0 무료 버전 사용

부록 B IDC/SDK 상호 참조

 

Practical Malware Analysis (실전 악성코드와 멀웨어 분석) / 마이클 시코스키·앤드류 호닉 지음, 여성구·구형준·박호진 옮김 / 에이콘

 - 목차 - 

 

0장 | 악성코드 분석 입문

 

1부 기초 분석

1장 | 기초 정적 분석 기법

2장 | 가상 정적 분석 기법

3장 | 기초 동적 분석

 

2부 고급 정적 분석

4장 | X86 디스어셈블리 속성 과정

5장 | IDA Pro

6장 | 어셈블리어에서의 C 코드 구조 식별

7장 | 악의적인 윈도우 프로그램 분석

 

3부 고급 동적 분석

8장 | 디버깅

9장 | OllyDbg

10장 | WinDbg를 이용한 커널 디버깅

 

4부 악성코드의 기능

11장 | 악성코드의 행위 특성

12장 | 위장 악성코드 실행

13장 | 데이터 인코딩

14장 | 악성코드 기반 네트워크 시그니처

 

5부 안티리버싱

15장 | 안티디스어셈블리

16장 | 안티디버깅

17장 | 안티가상머신 기법

18장 | 패커와 언패킹

 

6부 특별한 주제

19장 | 셸코드 분석

20장 | C++ 분석

21장 | 64비트 악성코드

 

부록

부록A | 주요 윈도우 함수

부록B | 악성코드 분석 도구

부록C | 실습 문제 풀이

 

 

728x90
728x90

+ Recent posts